显示窗口时不激活窗口的方法

今天有幸翻到一篇博客里面提供了一种可行的办法,简单说就是让子窗口的Create操作在父窗口的OnInitDialog中执行,然后在需要打开子对话框的时候,用dlg->ShowWindow(SW_SHOWNOACTIVATE);即可,虽然这导致子对话框必须提前建好,不过确实是不闪了。


原理估计是这样:子对话框的Create操作和带SW_SHOW参数的ShowWindow操作都会把激活状态抢过来,ShowWindow(SW_SHOWNOACTIVATE)只能避免其中的一次子窗口激活,不能避免Create的激活,所以在父窗口显示前先把子窗口Create,由于父窗口显示时会自动激活,因此也不会受到影响。

都不知道作者咋想出这么YD的方法,有点小nb。感谢大家回了这么多,也把那个博客贴出来,散粉了
http://blog.sina.com.cn/s/blog_45a78d510100qbo5.html

 MFC桌面右下角弹窗不抢当前窗口焦点同时不抢父窗口焦点_panshiqu的专栏-程序员宅基地 - 程序员宅基地 (cxyzjd.com)

 

1. 如果是启动一个新的进程显示一个窗口,可以如下实现:

 STARTUPINFO si = {0};
 si.cb = sizeof si;
 si.dwFlags = STARTF_USESHOWWINDOW;
 si.wShowWindow = SW_SHOWNOACTIVATE;
 PROCESS_INFORMATION pi = {0};
 TCHAR path[MAX_PATH] = _T("notepad.exe");
 CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

2. 如果是在当前程序显示一个非模态的对话框而不激活该窗口的话。

假设当前项目是一个对话框程序,CTestDlg类为主对话框,当点击CTestDlg的确定按钮的时候显示不激活的对话框CNoActiveDlg,则:

在CTestDlg类中定义CNoActiveDlg *m_dlgNoActive

在CTestDlg的OnInitDialog()中创建对话框:

m_dlgNoActive = new CNoActiveDlg();
m_dlgNoActive->Create(IDD_DLG_NO_ACTIVE);

在CTestDlg的OnOk()中:

m_dlgNoActive->ShowWindow(SW_SHOWNOACTIVATE);

这样当点击CTestDlg的确定按钮时,就会显示CNoActiveDlg窗口且此窗口未激活,激活窗口依然是CTestDlg。

注意,之所以在CTestDlg中定义CNoActiveDlg,是因为如果所有的工作都在OnOk中做的话:

CNoActiveDlg *dlg = new CNoActiveDlg();

dlg = new CNoActiveDlg();
dlg->Create(IDD_DLG_NO_ACTIVE);

dlg->ShowWindow(SW_SHOWNOACTIVATE);

将无法实现显示CNoActiveDlg窗口且未激活,这么做的结果是CNoActiveDlg窗口会被激活。

 

posted @ 2021-09-16 09:30  晨光静默  阅读(803)  评论(0编辑  收藏  举报