"基于 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
基于 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
相关文章推荐
- 基于 CDialog 的应用程序一开始便被隐藏的方法[转]
- 基于 CDialog 的应用程序一开始便被隐藏的方法 补充 CMainframe
- "... 无法下载Silverlight应用程序。请查看Web服务器设置." 问题的解决方法
- "由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题"解决方法
- "创建的CMO对象失败,应用程序将被中断"和"Unable to load VirtualBox engin"解决方法
- "您试图在此 Web 服务器上访问的 Web 应用程序当前不可用"IIS解决方法
- 针对网上流传的"Android 再按一次后退键退出应用程序"方法改正
- "在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误"的解决方法
- 关于Android4.0 emulator-arm.exe-应用程序错误,内存不能为"read"问题解决方法
- "/bin 不在PATH 环境变量中,故无法找到该命令"的一种解决方法
- "右键发送" 造成死机,解决方法,实验管用
- 解开Android应用程序组件Activity的"singleTask"之谜
- 解决"链接服务器 '(null)' 的 OLE DB 访问接口 'STREAM' 返回了对列 '[!BulkInsert].fieldname' 无效的数据"的一种替换方法
- "传奇杀手"病毒的处理方法
- "基于对象" 和 "面向对象"
- "Failed to access IIS metabase"解决方法
- Word退出时报错 "此文件正由另一个应用程序或用户使用"
- "undefined reference to" 问题解决方法
- "S3C2410移植Linux2.6.27 系统时钟慢8倍!"——解决方法
- "=="和equals方法的区别