为自定义 Win32 模式对话框模仿 ::DialogBox()

Posted

技术标签:

【中文标题】为自定义 Win32 模式对话框模仿 ::DialogBox()【英文标题】:Mimicking ::DialogBox() for a custom Win32 modal dialog 【发布时间】:2013-05-09 06:51:29 【问题描述】:

我有一个用 C++ 编写的老式 Win32 模态对话框。布局是在代码中构建的(不是从资源加载的),并使用自定义模式消息循环显示,如下所示:

    // Spin message loop
    window->m_modalInfo = &mi;
    while (!mi.modalFinished)
    
        // Get a message
        MSG msg;
        GetMessage(&msg, NULL, 0, 0);

        // Process dialog messages first
        if (IsDialogMessage(hWnd, &msg))
            continue;

        // Dispatch other messages
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    

在大部分作品中,除了一些烦恼

    使用 Common Controls 6 时,按标准对话框按 alt 键后,快捷助记符和虚线焦点矩形上的下划线不会出现。 (如果我在对话框启动时按住键,它们会出现)。

    单击父窗口时,我没有像标准对话框那样使对话框框闪烁。 (在运行上述循环之前,我将禁用拥有窗口)。

基本上我想要标准对话框过程的功能,但不从资源加载对话框。

需要明确的是,布局不能从资源中加载。我可以使用一个空的对话框模板,调用 ::DialogBox() 并在 WM_INITDIALOG 上以编程方式设置它的内容,但我想了解为什么上述方法不起作用。

【问题讨论】:

【参考方案1】:

如果您想以编程方式布局对话框,请使用DialogBoxIndirectParam

【讨论】:

以上是关于为自定义 Win32 模式对话框模仿 ::DialogBox()的主要内容,如果未能解决你的问题,请参考以下文章

在无模式对话框中阻止 ESC 和 Enter 键(Win32,非 MFC)

如何在 Win32 API 的对话框中显示自定义消息?

win32day08-位图的使用/坐标系和映射模式/文字和字体/对话框

怎样用win32 API函数弹出对话框

为自定义相机转动闪光灯时前置相机崩溃?

删除和重新添加所有项目和所有列时,列表视图在 Win32 对话框上闪烁