2010-01-23 81 views
7

我有用ShowWindow(hWnd,SW_SHOWNOACTIVATE)顯示的對話框; 但它不起作用,新的對話仍然偷竊焦點,爲什麼?如何顯示一個MFC對話框而不會偷窺另一個窗口

這裏是我的程序的一些代碼片段,QueryWindow與對話鏈接對話框的MFC類:

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

確實QueryWindow有一個OnInitDialog方法?如果是這樣,請嘗試在方法結束時返回FALSE而不是TRUE。 – 2010-01-23 18:08:06

+0

不,它的工作。謝謝。 – jay 2010-01-25 05:46:01

+0

我想我們需要更多的代碼來找出問題所在。你可以發佈QueryWindow源代碼嗎?它是什麼樣的對話? – 2010-01-25 07:16:41

回答

5

有多種方法來防止引火集中跳過對話:

  • 讓你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; 
    } 
    

    這是值得解決方案,因爲可能你可以得到閃爍。

重要!

不要忘記控制以下API調用:

  • 的ShowWindow - 您可以使用SW_SHOWNOACTIVATE,但不能使用SW_SHOW
  • SetWindowPos - 添加標誌SWP_NOACTIVATE
+0

非常感謝@謝謝,你救了我的一天。這個答案值得贊成。 – Ram 2017-04-18 21:02:09

相關問題