如何让基于对话框的mfc程序启动后自动隐藏对话框

 我来答
huanglenzhi
2014-12-28 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517169
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  1.定时器
  最直观,又是最无奈的一个方法就是使用定时器。既然我们在对话框开始显示之前不能用ShowWin

  dow(SW_HIDE)将其隐藏,那就给一个时间让它显示,完了我们在隐藏它。

  方法:

  1.在OnInitDialog()函数里设置定时器:(WINDOWS API里面响应消息WM_INITDIALOG)

  SetTimer(1, 1, 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(&rect);

  在需要显示的地方:

  SetWindowPos(&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::OnCr

  eate()里面加入下代码:

  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);即将窗口的扩

  展样式改回来。

  转载
百度网友349d18b
2014-12-27 · TA获得超过444个赞
知道小有建树答主
回答量:571
采纳率:50%
帮助的人:364万
展开全部
在OnInitDialog函数里ShowWindow(SW_HIDE)就行了
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
归悦欣cf
2014-12-27 · TA获得超过1443个赞
知道大有可为答主
回答量:4250
采纳率:60%
帮助的人:1288万
展开全部
vcool888 已经回答了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式