c - MessageBox 在处理来自 DialogBox 的 WM_DESTROY 事件时不起作用

标签 c user-interface winapi

在详细说明 another question 的答案时(我自己),我想到了使用 MessageBox 来报告对话框结果的想法。它是一个使用 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 拉出队列,退出循环并在对话框显示之前返回。

(* 实际上这不是一条“真正的”消息 - 设置了一个内部标志,指示退出已发布 - 但在后续消息循环中效果相同)

关于c - MessageBox 在处理来自 DialogBox 的 WM_DESTROY 事件时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854078/

相关文章:

java - 面板未添加到 GUI

windows - Windows 是否允许有一个同时带有帮助按钮和最小/最大按钮的窗口?

c++ - 将文件映射到ram

c - 为 char 字符串的长度分配一个大值会成为问题吗?

c - 数字总和程序无法为更大的数字提供正确的 O/P

javascript - 使用模板字符串的 tailwindcss 动态边框颜色不起作用

c++ - win32 GetConsoleMode() 错误代码 6

c++ - 如何区分外置硬盘和内置硬盘?

c++ - 没有双缓冲的 WM_EX_COMPOSITED

c - 对 `pthread_create' 的 undefined reference -pthread 不工作