【问题标题】:Create a modeless dialog box that starts inactivated (MFC)创建一个启动非激活的无模式对话框 (MFC)
【发布时间】:2021-12-19 02:25:42
【问题描述】:

我想制作一个无模式对话框,在没有被激活的情况下显示自己。
我试过了

m_ReminderDialog = new CReminderDialog();
m_ReminderDialog->Create(CReminderDialog::IDD, GetDesktopWindow());

带有对话框模板

IDD_REMINDER DIALOGEX 0, 0, 318, 269
STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME 
EXSTYLE WS_EX_TOPMOST | WS_EX_NOACTIVATE | WS_EX_APPWINDOW
...

但它仍然会被激活。
我尝试直接制作一个窗口,而不是在 MFC 中并使用CreateWindowEx,与

WS_EX_NOACTIVATE | WS_EX_APPWINDOW

那行得通。该窗口处于非活动状态,但可以通过单击任务栏按钮将其激活。
我读到对Create 的调用会激活窗口。是这样吗,如果是这样,有没有办法创建不覆盖WS_EX_NOACTIVATE 的无模式对话框?

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    事实证明,我发布的代码确实创建了对话框,但没有给它输入焦点。
    我只是认为它具有输入焦点,原因有两个 -

    • 对话框上的标题栏没有变灰
    • 当我在一个单独的程序中尝试CreateWindowEx 时,使用相同的WS_EX_NOACTIVATE 标志,它只能通过单击任务栏按钮来激活。因此,WS_EX_NOACTIVATE 在对话框模板中的作用与在调用CreateWindowEx 时的作用不同。

    我尝试了编写的代码,在创建对话窗口之前调用了Sleep,因此我有时间将焦点设置到文本文档。然后我一直等到对话框创建完成。

    对话框创建后,我可以一直在文本文档中输入,所以对话框没有输入焦点。我还可以通过调用SetWindowPos 将对话框放在其他窗口的顶部,但仍然没有给它输入焦点。

    但是,当DS_SETFOREGROUND 也用于对话框模板时,WS_EX_NOACTIVATE 不会工作。不足为奇。

    【讨论】:

      【解决方案2】:

      从模板中删除WS_VISIBLE 样式,然后添加(在Create() 之后):

      m_ReminderDialog->ShowWindow(SW_SHOWNOACTIVATE);
      

      参考信息:ShowWindow

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多