본문 바로가기

MFC/유용한 정보

[MFC] 부모 다이얼로그가 자식 다이얼로그 아래에만 위치하는 현상 ※ 요약 아래 이미지와 같이 자식 다이얼로그를 모달리스로 생성하고 띄울때, 부모 다이얼로그(윈도우)가 항상 자식 다이얼로그 밑에 위치하는 경우가 있다. 이는 자식 다이얼로그를 생성할때 부모 Wnd를 어떻게 지정하느냐에 따라 달라지는데 이번 포스트에서는 부모/자식 다이얼로그에 상관없이 활성화된 다이얼로그가 위로 올라오게 하는 방법을 알아보겠다. ※ 소스코드 먼저 소스코드부터 보겠다. Create함수의 두 번째 파라미터의 부모 Wnd를 this로 할 경우 부모 다이얼로그가 항상 자식 다이얼로그 밑에 위치하게 된다. 반대로 CWnd::GetDesktopWindow()로 지정하면 부모/자식 상관없이 활성화된 다이얼로그가 위로 올라오게 된다. ※ 적용 후 this 대신 CWnd::GetDesktopWindow로 .. 더보기
[MFC] OnGetMinMaxInfo - 윈도우 최소, 최대 사이즈 지정 ※ 요약 윈도우의 WM_GETMINMAXINFO 메시지에 대한 포스트다. 이 메시지는 윈도우의 크기나 위치가 변경되었을때 발생하며 보통 윈도우의 최소, 최대 크기를 지정하여 프로그램이 너무 작거나 너무 크게 변경할 수 없도록 해야할때 사용한다. 예제로 만든 프로젝트는 다이얼로그 기반이지만, SDI, MDI 등에서도 적용가능하다. ※ 설명 아래 MFC 프로젝트는 GetMinMaxInfo 설명을 위해 다이얼로그 기반으로 만든 순수 MFC 예제다. 먼저 "클래스 뷰"탭으로 이동하여 다이얼로그 클래스에 마우스 우클릭을 하여 팝업된 메뉴에서 "속성" 항목을 선택한다. (만약 SDI나 MDI 프로젝트일 경우엔 CMainFrame 클래스에 하면 된다.) 메시지 항목을 선택한 후 WM_GETMINMAXINFO 항목을 .. 더보기
[MFC] Alt키나 Ctrl키 눌렸는지 확인하기 ※ 요약 MFC로 개발하다 보면 Alt키나 Ctrl키가 눌렸는지 알아야 할 때가 있다. 이번 포스팅에서는 그 방법을 알아보도록 하겠다. 참고로 전역적으로 하려면 후킹을 통해서 하거나 드라이버 단에서 해야하며, 후킹을 통한 방법은 나중에 올리도록 하겠다. ※ 소스코드 BOOL CKeyDownDlg::PreTranslateMessage( MSG* pMsg ) { if( pMsg->message == WM_SYSKEYDOWN ) { AfxMessageBox( _T("Alt") ); } if( (GetAsyncKeyState(VK_CONTROL)&0x8000) ) { AfxMessageBox( _T("Ctrl") ); } return CDialogEx::PreTranslateMessage( pMsg ); } ※.. 더보기
[MFC] 계층도 및 프로그램의 실행 흐름 요약 ※MFC 계층도 16년 01월 25일 기준 최신 계층도이다. 출처 - MSDN 아래 그림은 CObject로부터 파생된 MFC 클래스들을 나타낸다. 아래 그림은 CWnd 및 CCmdTarget로부터 파생된 MFC 클래스들을 나타낸다. 아래 그림은 CObject로부터 파생되지 않은 MFC 클래스들을 나타낸다. ※MFC 프로그램 실행 요약 프로젝트 이름이 Temp라고 했을 때, 각 추적점 및 TRACE를 추가하여 프로그램을 실행시킨 결과는 아래와 같다. CTempApp::CTempApp() ------ App 클래스 변수가 전역변수로 선언되어있으므로 제일 먼저 생성자가 호출된다 CTempApp::InitInstance() ------ MFC 코드에 숨겨진 AfxWinMain함수에서 호출된다. (프로그램의 설정.. 더보기
[Win32 API, MFC] VK_ 가상 키 코드 ( Virtual-Key Codes ) Win32 API 나 MFC에서 사용되는 가상 키 코드 ( VK_ ) 입니다.출처는 마이크로소프트 MSDN입니다. http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx VK_LBUTTON0x01Left mouse buttonVK_RBUTTON0x02Right mouse buttonVK_CANCEL0x03Control-break processingVK_MBUTTON0x04Middle mouse button (three-button mouse)VK_XBUTTON10x05X1 mouse buttonVK_XBUTTON20x06X2 mouse button-0x07UndefinedVK_BACK0x08BACKSPACE keyVK_.. 더보기
Win32 API, MFC에서 디버깅용 콘솔 창 띄우기 아래는 MFC 프로젝트에 디버깅을 위한 콘솔 창을 띄운 모습입니다. (아래 프로그램은 로또 프로그램) 사실 MFC의 경우는 아래 캡쳐와 같이 TRACE 매크로를 통해 로그(디버깅 메시지)를 확인할 수 있지만Win32 API의 경우는 TRACE 매크로가 없으며, 있어도 TRACE보다는 printf로 출력하는 게 더 편할 때도 있어서 가끔 콘솔창을 이용합니다. TRACE보다 printf로 출력하면 더 편한 몇 가지 이유로는 - printf의 경우 서식문자를 쓸수 있다. ex) printf( "에러 번호 : %d, 에러 내용 : %s", nErrorNum, GetLastError() ); - TRACE의 경우 출력 창에 내용이 표시되는데, TRACE 내용 말고도 잡다한 내용이 많다. - 콘솔 창의 경우는 내가.. 더보기