닫기 저장 파일 대화 상자를 Win32 프로젝트에 구현하려하지만 이상한 문제가 발생합니다. 여기 내 해결책이있다.사용자 입력없이 MessageBox가 반환됩니까?
Visual Studio에서 간단한 win32 프로젝트를 만듭니다.
새 창을 만들려면 WM_COMMAND를 처리하십시오.
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
InitInstance(hInst, SW_SHOW);
//DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
windowCount--;
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
- 핸들 WM_SYSCOMMNAD는 저장-전에-종료 메시지 박스를 표시합니다. 모든 창을 닫은 후 종료 보장하기
closeCount
및windowCount
변수
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
int ret = MessageBox(NULL, L"do you really want to close", L"question", MB_YESNO|MB_APPLMODAL);
if (ret == IDNO)
return 0;
closedCount++;
StringCchPrintf(buff, 256, L"hwnd %x user choose to close\n", hWnd);
OutputDebugString(buff);
}
return DefWindowProc(hWnd, message, wParam, lParam);
- 이.
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0) || (closedCount != windowCount))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
windowCount++;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
전체 코드 : http://pastebin.com/EVWWMz8L
위의 코드에서이 버그가 있습니다
두 창을 만들고 각각의 윈도우 닫기 버튼을 클릭 한 다음 하나의 창에 대한 닫 확인이 두 창을 모두 닫습니다. 즉, 하나의 창에서 MessageBox를 닫으면 사용자 입력없이 다른 창에서 MessageBox가 반환됩니다.
두 개의 창을 만들고 각 창에 대해 닫기 단추를 클릭하십시오. 그런 다음 에어로 축소판을 사용하여 하나의 메시지 상자를 활성화하고 닫으려면 확인하지만 연결된 창은 닫히지 않습니다. 메시지 상자를 닫으려면 두 메시지 상자를 모두 확인해야합니다.
어떻게 내 코드가 잘못 되었나요?