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

本文探讨了在基于 CDialog 的应用程序中如何在启动时隐藏窗口,避免闪现问题。通过响应 WM_SHOWWINDOW 消息并调整窗口样式,可以实现窗口隐藏。然而,这种方法会导致对话框出现在后台,无法在前台显示。最后,文章提供了一个解决方案,即在 OnInitDialog() 后调用 RunModalLoop(),并在需要时使用 ShowWindow() 显示对话框。
摘要由CSDN通过智能技术生成
"基于 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值