我有一个用 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/