티스토리 뷰
프로그램이 종료가 되지않지 않는 한 IsDialogMessage() 는 항상 TRUE 값을 가지므로 무한 메시지루프 가능해짐.
모달과 모덜리스 차이점
1. WS_VISIBLE 기본값
2. 메시지 큐 사용
3. 모덜리스다이얼로그 종료시키기 위해 DestroyWindow(hDlg) 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | HWND hDlgModeless; // 외부변수 BOOL CALLBACK ColorScrDlg(HWND, UINT, WPARAM, LPARAM); // 모달리스다이얼로그 메시지 처리함수 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { ... hDlgModeless = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ColorScrDlg); ... // 기본 메시지 루프입니다. while (GetMessage(&msg, nullptr, 0, 0)) { if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg)) { // 모달리스다이얼로그는 메시큐를 통해 메시지 전달됨 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } return (int) msg.wParam; } BOOL CALLBACK ColorScrDlg(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_INITDIALOG: // 다이얼로그 초기화 ... return TRUE; case WM_CLOSE: DestroyWindow(hDlgModeless); break; } return FALSE; } | cs |