【问题标题】:EndDialog vs DestroyWindowEndDialog 与 DestroyWindow
【发布时间】:2025-12-19 21:10:17
【问题描述】:

您好,我正在创建 Windows 上下文菜单的模拟。

显示对话框如下:

  1. 使用CreateDialogIndirectParam 创建一个对话框
  2. 运行一个消息循环:

    while ( ContinueModal() && GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
    
  3. 在我寻找新窗口失去焦点事件的对话框中,我将ContinueModel 标志设置为false 并调用EndDialog / DestroyWindow

    • 调用EndDialog 不会杀死我的对话,DestroyWindow 会。可以吗,谁能解释一下原因?

谢谢! D.

【问题讨论】:

    标签: c++ windows winapi win32gui windows-messages


    【解决方案1】:

    就像文档第一行中所说的那样,EndDialog ends modal dialogs。您的对话框不是模态的,所以 EndDialog 是错误的功能。 The documentation for CreateDialogIndirectParam

    要销毁对话框,请使用 DestroyWindow 函数。

    【讨论】:

    • 在文档中挖掘了更多内容后,我实际上想到了很多。但你是对的,谢谢!我玩 Spy++ 玩得很开心 :)
    • 2021 更新:似乎EndDialog 现在也关闭了无模式对话框(至少它在我的系统上一直如此)。这有点酷,因为它有时允许使用相同的DLGPROC,而不管对话框是否以模态方式显示。但实际上你不能真正使用它,因为它没有记录。这是双重糟糕的,因为您不能依赖未记录的“功能”,但与此同时,错误会被忽视,因为它碰巧起作用
    • 我没有看到您描述的行为。 EndDialog 仍然不会破坏对话框。
    • @RaymondChen 经过进一步调查,您是完全正确的(在 Visual Studio 的新“Windows 桌面应用程序”模板项目中测试,将 DialogBox 调用(到“关于”框)替换为 @ 987654329@ + ShowWindow)。它不会破坏对话框,而是有效地隐藏它。不过ShowWindow 没有,因为我在 Spy++ 中没有看到WM_SHOWWINDOW 消息。事实上,我不知道它到底做了什么,但它删除了WS_VISIBLE。无论如何,这是一个很难找到的错误,因为乍一看它似乎做了正确的事情。
    • @metablaster 文档是正确的。使用 DestroyWindow 销毁使用 CreateDialogIndirectParam 创建的对话框。 EndDialog 用于销毁模式对话框(告诉内部对话框消息循环退出)。对于 CreateDialogIndirectParam,没有内部对话消息循环。