如何在不将焦点转移到其他窗口的情况下显示MFC对话框

jay*_*jay 7 c++ mfc

我有ShowWindow显示的对话框(hWnd,SW_SHOWNOACTIVATE); 但它不起作用,新的对话仍然是重点,为什么呢?

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

QueryWindow window;
//window.DoModal();
window.Create(QueryWindow::IDD);
window.ShowWindow(SW_SHOWNOACTIVATE);
Run Code Online (Sandbox Code Playgroud)

Ser*_*gey 7

几乎没有办法可以跳过对话以获得专注:

  • 让你OnInitDialog()返回零值.例:

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

    这是最好,最正确的解决方案.

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

    BOOL QueryWindow::PreCreateWindow(CREATESTRUCT& cs)
    {
        cs.dwExStyle |= WS_EX_NOACTIVATE;
    
        return CDialog::PreCreateWindow(cs);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    这是值得的解决方案,因为你可能会得到闪烁.

重要!

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

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