您的位置:首页 > 其它

"基于 CDialog 的应用程序一开始便被隐藏的方法"再探

2012-01-20 14:56 309 查看
"基于 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐