在为another question(我自己)详细说明答案时,我想到了使用一个消息框来报告我的对话框的结果。它是用DialogBox()函数创建的WinAPI模式对话框。
但是,我注意到在对话框的过程函数中处理WM_DESTROY会阻止消息框出现。我想了解背后的机制。
这是完整的代码,引用的消息框在最后,就在return 0之前:

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <string.h>
#include "resource.h"

INT_PTR CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
    // uncomment these and the MessageBox won't show up
    //case WM_DESTROY:
        //PostQuitMessage(0);
        //break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
            if (MessageBoxW(hwnd, L"Close the window?", L"Confirm", MB_OKCANCEL) == IDOK)
                EndDialog(hwnd, (INT_PTR)wParam);
            break;
        case IDCANCEL:
            MessageBoxW(hwnd, L"Goodbye.", L"Close", MB_OK);
            EndDialog(hwnd, (INT_PTR)TRUE);
            break;
        }
    }
    return (INT_PTR)FALSE;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    INT_PTR ret = DialogBoxW(NULL, MAKEINTRESOURCEW(IDD_DIALOG1), NULL, DlgProc);

    wchar_t retTxt[10];
    if (ret == IDOK)
        wcscpy(retTxt, L"Alright!");
    else
        wcscpy(retTxt, L"Error");

    MessageBoxW(NULL, retTxt, L"Result", MB_OK);

    return 0;
}

最佳答案

当您使用DialogBox而不是DialogBoxParam时,对话框会运行自己的消息循环,该循环在内部处理WM_DESTROY。当您从对话框过程发布WM_QUIT消息时,您将生成一条对话框不使用的附加消息,因此一旦DialogBox函数返回,它将保留在线程的消息队列中。
然后调用MessageBox,它运行自己的消息循环。这立即将队列中的WM_QUIT拉出,退出循环并在对话框显示之前返回。
(*实际上它不是一个“真实的”消息-设置了一个内部标志,指示已发布退出-但在随后的消息循环中效果相同)

08-16 00:15