Почему после вызова функции DestroyWindow не вызывается функция MessageBox
Я использую код
#include <windows.h>
#include <iostream>
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
if (message == WM_DESTROY)
{
PostQuitMessage(0);
}
else if (message == WM_PAINT)
{
Sleep(2000)
PostQuitMessage(0);
}
else
{
return DefWindowProcA(hwnd, message, wparam, lparam);
}
}
int main()
{
WNDCLASSA wndcls;
memset(&wndcls, 0, sizeof(wndcls));
wndcls.lpszClassName = "CLASS";
wndcls.lpfnWndProc = WndProc;
RegisterClassA(&wndcls);
HWND hwnd = CreateWindow(wndcls.lszClassName,
NULL,
WS_OVERLAPPENDWINDOW,
10,
10,
500,
200,
NULL, NULL, NULL, NULL);
ShowWindow(hwnd, SW_SHOWNORMAL)
MSG msg;
while(GetMessage(&msg, 0, 0))
{
DispatchMessage(&msg);
}
DestroyWindow(hwnd);
Sleep(2000)
MessageBoxA(NULL, "Text", "Header", MB_ICONINFORMATION);
return 0;
}
Выводится окно созданное через hwnd затем закрывается через функцию DestroyWindow(hwnd), но окно созданное через MessageBoxA не выводится, далее просто завершается программа. Если я убираю PostQuitMessage(0) из условия WM_PAINT, то MessageBox срабатывает как надо. В чем может быть проблема?
Ответы (1 шт):
Автор решения: Alex Guteniev
→ Ссылка
Внутри MessageBox есть цикл сообщений, который тоже завершается по WM_QUIT. Лишние WM_QUIT из первого цикла завершают и второй цикл.
Это штатный способ выхода из вложенных циклов сообщений; правильно достигать этого эффекта так:
while(GetMessage(&msg, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
PostQuitMessage(msg.wParam); // передали предыдущий параметр PostQuitMessage дальше