Почему после вызова функции 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 дальше
→ Ссылка