MFC隐藏主窗口运行的几种方法

来源:互联网 发布:学编程在家里能赚钱吗 编辑:程序博客网 时间:2024/06/08 05:43
有很多应用程序要求一起动就隐藏起来,这些程序多作为后台程序运行,希望不影响其他 窗口,往往只在托盘区显示一个图标。这些程序通常都是对话框程序,而对话框在初始化的过程上与SDI、MDI的初始化是不同的,对话框只需要 DoModule或者是CreateDialog等等对话框函数调用一次便可,SDI、MDI则要好几步才行。这样看来,对话框在使用方法上面是隐藏了不少细节的,其中就没有SDI、MDI所要求的ShowWindow(nCmdShow)这一步。因此对话框要想一运行就隐藏,并不是很直接的。有一些方法 可以做到这一点,下面我们就来看看几种方案。

  1.定时器
  最直观,又是最无奈的一个方法就是使用定时器。既然我们在对话框开始显示之前单独用ShowWindow(SW_HIDE)不能将其隐藏,那就给一个时间让它显示,完了我们在隐藏它。
  方法:
  (1).在OnInitDialog()函数里设置定时器:(WINDOWS API里面响应消息WM_IN99vDIALOG)
  SetTimer(11, NULL);
  (2).添加处理WM_TIMER的消息处理函数OnTimer,添加代码:
  if(nIDEvent == 1)
  {
  DeleteTimer(
1);
   ShowWindow(SW_HIDE);
  }
  这种方法的缺点是显而易见的,使用定时器,使得程序的稳定性似乎打一个折扣;窗口是要先显示出来的,那么效果就是窗口闪了一下消失。

  2.改变对话框显示状况
  在对话框初始化时改变其显示属性可以让它隐藏起来。方法是调用 SetWindowPlacement函数:
代码
  BOOL CDialogExDlg::OnInitDialog()
  {
  CDialog::OnInitDialog();
  
//DO something
   WINDOWPLACEMENT wp;
   wp.length
=sizeof(WINDOWPLACEMENT);
   wp.flags
=WPF_RESTORETOMAXIMIZED;
   wp.showCmd
=SW_HIDE;
   SetWindowPlacement(&wp
);
  
return TRUE;
  }


  在需要显示时(通常是响应热键或者托盘图标的鼠标消息):

  WINDOWPLACEMENT wp;
   wp.length
=sizeof(WINDOWPLACEMENT);
   wp.flags
=WPF_RESTORETOMAXIMIZED;
   wp.showCmd
=SW_SHOW;
   SetWindowPlacement(
&wp);


  这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示, 还需加上如下代码:
  定义一个成员变量CRect rect;
  在OnInitDialog()里面:
  GetWindowRect(%26;amp;rect);


  在需要显示的地方:

  SetWindowPos(%26;amp;wndNoTopMost, wndRc.left, wndRc.top, wndRc.right, wndRc.bottom, SWP_SHOWWINDOW);
  CenterWindow();


  即使这样,效果还是很差。
  这种方法还有一个弊端是当程序开始运行并且隐藏起来后,原来激活的窗口变成了非 激活状态了,而当对话框显示出来后,对话框自身也是非激活状态的。
  3.不绘制窗口
  当对话框显示时将要响应消息WM_PAINT绘制客户区,相应消息 WM_NCPAINT绘制窗口边框。我们在窗口第一次自绘自身时隐藏窗口,可以收到比较良好的效果。由于窗口是先画窗口边框,所以我们仅需处理 WM_NCPAINT即可。代码如下:
  添加WM_NCPAINT处理函数。

复制代码
  void CMyDialog::OnNcPaint()
  {
  
static int i = 2;
  
if(i > 0)
  {
  i 
--;
  ShowWindow(SW_HIDE);
  }
  
else
  CDialog::OnNcPaint();
  }
复制代码


  这里有个问题:为什么要定义静态变量i而且设其值为2呢?
  我们只要窗口隐藏第一次,所以定义这个变量可以判断是否时首次显示窗口。当程序 开始运行时,系统发送(SendMessage)WM_NCPAINT消息,此时程序的窗口边框应该被显示,但是此时我们没有作任何显示的操作,而是将窗 口隐藏,ShowWindow(SW_HIDE)将把窗口的WS_VISIBLE属性去掉,继续执行,程序将检查WS_VISIBLE属性,如果没有则显 示窗口,所以又发送了一个WM_NCPAINT消息。所以我们要处理两次WM_NCPAINT消息。
  在需要窗口显示时,调用ShowWindow(SW_SHOW)即可。
  程序执行的结果是,原来处于激活状态的窗口可能会闪动两下,然后仍然处于激活状 态。这种处理方式比上面的方式要优越得多。
  4.将对话框作为子窗口
  这种方法是采用SDI框架,主窗口始终隐藏,对话框作为主窗口的成员变量,在 CMainFrame::OnCreate()里面加入下代码:

  if(!dlg.Create(IDD_MYDIALOG, this))
  {
  
return –1;
  }
  dlg.ShowWindow(SW_HIDE);


  在要显示对话框的地方用dlg.ShowWindow(SW_SHOW);即 可。注意,主窗口一定要隐藏,否则对话框可能会闪现一下。
  隐藏状态栏窗口
  上面介绍了几种检查对话框的方法,大家如果试过的话可能已经注意到系统状态栏里 在程序启动时会有程序的图标闪过,在隐藏对话框的时候这个也是要隐藏的,方法很简单:
  在OnInitDialog()函数里面加上 ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);即可。在要显示窗口的地方加上代码ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);即将窗口的扩展样式改回来。
  以上各种方法转自网络。我自己实验了下觉得下面的方法还不错
  在OnInitDialog()里填下下面几句话

  //隐藏界面
  MoveWindow(0,0,0,0);
  ShowWindow(SW_HIDE);
  ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);


5. 设置窗口为0像素,坐标移到屏幕最角落处

  //隐藏界面
  int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
   int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
   SetWindowPos(NULL, nFullWidth, nFullHeight, 0, 0, SWP_NOZORDER);  //设置0像素,移到最角落  或者:MoveWindow(0,0,0,0);
   ShowWindow(SW_HIDE);
   ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);  //移除任务栏图标显示



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 女生被舔照片视频 床上运动奶视屏 00后小萝莉 喷液视频完整 2019看黄不付费 十部挑战人伦底线的电影 标准七十二种插法不遮不演 床上99种捅法 36种插法不遮不挡视频 儿子曰亲妈 妈装唾视频 爷爷插妈视频 老婆非让我睡她妈视频 真实儿曰亲妈视频观看 单身儿子单身妈 儿子再用点力妈要飞了中文 在上海陪读初三的儿子 加油儿子妈要流了txt 啊儿子深点妈要来了txt 儿子上来妈教你的故事 儿子在快一点妈要飞了视频 单身妈喜欢找儿子 中国家庭毋HH伦s线播放普通话 中国家庭真实毋HH伦s线播放 儿子你快点搞你爸要回来吗 儿子快点你爸回来了嗯 儿子你搞快点你爸要回来啦文字 快点你爸马上就回来了视频 儿子你搞快点你爸要回来啦电影 儿子快拿出来你爸快回来了视频 儿子你要高就快点你爸回来了电影 儿子你要就快点你爸要回来了小说 儿子 快点妈要来了漫画 你快点啊你爸快回来了视频 儿子快点你爸快回来了在哪能看 儿子搞快点你爸要回来了短文 儿子你快停下你爸要醒了视频 儿子用点力妈 儿子深一点用点力阅读 你要搞就快点你爸快回来了视频 试衣间深一点用点力视频 儿子深一点用点力阅读张研 儿子你用点力全文阅读