我有用ShowWindow(hWnd,SW_SHOWNOACTIVATE)顯示的對話框; 但它不起作用,新的對話仍然偷竊焦點,爲什麼?如何顯示一個MFC對話框而不會偷窺另一個窗口
這裏是我的程序的一些代碼片段,QueryWindow與對話鏈接對話框的MFC類:
QueryWindow window;
//window.DoModal();
window.Create(QueryWindow::IDD);
window.ShowWindow(SW_SHOWNOACTIVATE);
我有用ShowWindow(hWnd,SW_SHOWNOACTIVATE)顯示的對話框; 但它不起作用,新的對話仍然偷竊焦點,爲什麼?如何顯示一個MFC對話框而不會偷窺另一個窗口
這裏是我的程序的一些代碼片段,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;
}
這是值得解決方案,因爲可能你可以得到閃爍。
重要!
不要忘記控制以下API調用:
非常感謝@謝謝,你救了我的一天。這個答案值得贊成。 – Ram 2017-04-18 21:02:09
確實QueryWindow有一個OnInitDialog方法?如果是這樣,請嘗試在方法結束時返回FALSE而不是TRUE。 – 2010-01-23 18:08:06
不,它的工作。謝謝。 – jay 2010-01-25 05:46:01
我想我們需要更多的代碼來找出問題所在。你可以發佈QueryWindow源代碼嗎?它是什麼樣的對話? – 2010-01-25 07:16:41