"基于 CDialog 的应用程序一开始便被隐藏的方法"再探
基于 CDialog 的应用程序有时候需要一开始便隐藏窗口,如微软的DispRes例子,程序一开始就被放到托盘上,对话框本身
是不显示的。 把这个例子移植到MFC时会遇到对话框一开始便要隐藏的问题。
以前这个问题的解决方法不完善,就是对话框初始化时设置一个100ms的定时器,在定时器中把对话框隐藏,但窗口会一闪。
于是搜索到一篇文章:“ 基于 CDialog 的应用程序一开始便被隐藏的方法“。
作者: Solomon (lsong@kali.com.cn) //http://www.programfan.com/article/1263.html。 日期: 2001/12/29
相关文章: http://www.csdn.net/develop/article/11/11634.htm
这个方法的主要代码如下:
在对话框中响应‘ WM_SHOWWINDOW’:
void CTestDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
if( GetStyle() & WS_VISIBLE )
{
CDialog::OnShowWindow(bShow, nStatus);
}
else
{
long Style = ::GetWindowLong(*this, GWL_STYLE);
::SetWindowLong(*this, GWL_STYLE, Style | WS_VISIBLE);
CDialog::OnShowWindow(SW_HIDE, nStatus);
}
}
//
经过测试,发现这个方法并没有真正隐藏窗口,对话框会出现在当前窗口的后面(Z order),通过移动当前窗口
另外还有一个问题是使用这个方法,再也不能使对话框在前台显示。(如响应托盘消息‘打开主窗口’)。
经过探索。发现解决问题的方法其实非常简单。就是在对话框初始化(OnInitDialog())完后,直接调用:
// do not show window !
RunModalLoop();// forever ! MLF_NOIDLEMSG MLF_SHOWONIDLE (ModalLoop)FLAG
#ifdef _DEBUG
afxDump << "OnInitDialog() end.\n";
#endif
//
return TRUE; // return TRUE unless you set the focus to a control
}
当托盘‘open’主窗口时:
ShowWindow(SW_SHOWNORMAL);//
CenterWindow();
当从托盘退出时:
EndModalLoop(0);
PostQuitMessage(0);
详细代码见我的资源‘屏幕分辨率.zip’
http://download.csdn.net/detail/schlafenhamster/4029481