我有ShowWindow显示的对话框(hWnd,SW_SHOWNOACTIVATE); 但它不起作用,新的对话仍然是重点,为什么呢?
这是我程序中的一些代码片段,QueryWindow是与对话框链接的MFC对话框类:
QueryWindow window;
//window.DoModal();
window.Create(QueryWindow::IDD);
window.ShowWindow(SW_SHOWNOACTIVATE);
答案 0 :(得分:7)
有几种方法可以跳过对话,无法集中精力:
让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调用: