Я пытаюсь реализовать диалог close-save-file в проекте Win32, но возникает странная проблема. Вот мое решение.MessageBox возвращается без ввода пользователем?
Создайте простой проект win32 в Visual Studio.
Обращение 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, чтобы показать себя, перед тем, бросить MessageBox.
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);
- две переменной
closeCount
иwindowCount
для обеспечения прекращается после того, как все окна закрыты.
// 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 в другом окне будет возвращаться без ввода пользователем.
Создайте два окна и нажмите кнопку закрытия для каждого окна. Затем используйте aero thumbnail, чтобы активировать одно сообщение и подтвердить, чтобы закрыть, но соответствующее окно не будет закрыто. Мне нужно подтвердить оба окна сообщений, чтобы закрыть окно.
Как это могло случиться, что случилось с моим кодом?