我有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; }
这是值得的解决方案,因为可能会有闪烁.
重要!
不要忘记控制以下API调用:
> ShowWindow – 您可以使用SW_SHOWNOACTIVATE,但不能使用SW_SHOW> SetwindowPos – 添加标志SWP_NOACTIVATE
原文地址:https://www.jb51.cc/c/119260.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。