c++ - 如何在不窃取其他窗口焦点的情况下显示 MFC 对话框

标签 c++ mfc

我有一个用 ShowWindow(hWnd, SW_SHOWNOACTIVATE) 显示的对话框; 但是不行,新对话框还是抢了焦点,这是为什么呢?

这是我程序中的一些代码片段,QueryWindow 是与对话框链接的 MFC 对话框类:

QueryWindow window;
//window.DoModal();
window.Create(QueryWindow::IDD);
window.ShowWindow(SW_SHOWNOACTIVATE);

最佳答案

有几种方法可以跳过对话以获得焦点:

  • 使您的 OnInitDialog() 返回零值。示例:

    BOOL QueryWindow::OnInitDialog()
    {
        CDialog::OnInitDialog();
    
        return FALSE; // return 0 to tell MFC not to activate dialog window
    }
    

    这是最好最正确的解决方案。

  • 将 WS_EX_NOACTIVATE 样式添加到您的对话窗口。您可以编辑对话框资源属性或在运行时更改它:

    BOOL QueryWindow::PreCreateWindow(CREATESTRUCT& cs)
    {
        cs.dwExStyle |= WS_EX_NOACTIVATE;
    
        return CDialog::PreCreateWindow(cs);
    }
    

    副作用:您可以在窗口上使用控件,但它看起来好像没有被激活。

  • 最后一种方法是在创建对话框之前保存前景窗口 并在最后设置前景窗口:

    BOOL QueryWindow::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
    {
        CWnd* pForeground = GetForegroundWindow();
    
        const BOOL bRes = CAlertDialog::Create(lpszTemplateName, pParentWnd);
    
        if(pForeground)
            pForeground->SetForegroundWindow();
        return bRes;
    }
    

    这是有值(value)的解决方案,因为您可能会出现闪烁。

重要!

不要忘记控制以下 API 调用:

  • ShowWindow - 您可以使用 SW_SHOWNOACTIVATE,但不能使用 SW_SHOW
  • SetWindowPos - 添加标志 SWP_NOACTIVATE

关于c++ - 如何在不窃取其他窗口焦点的情况下显示 MFC 对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122278/

相关文章:

c++ - 与 parent 一起杀死qprocess

c++ - 从 double 转换总是返回零

c++ - 获取模板中数组最小值的函数

windows - 在 MFC 中注册文件关联在 Windows 7 上不起作用

c++ - DLL 中的 CImage 析构函数会阻塞整个 MFC 程序

c++ - 为什么文件范围静态变量必须被零初始化?

c++ - 将任何数据类型传递给 C++ 中的函数

c++ - 如何解决 Cppcheck 中的问题 ID "toomanyconfigs"和 "missingInclude:"

c++ - 将带有 MFC 的 C++ 移植到触摸屏

c++ - NetShareEnum (..) winapi 无法删除不必要的共享文件夹