VC中隐藏对话框窗口计算机等级考试

文章作者 100test 发表时间 2010:01:01 12:58:42
来源 100Test.Com百考试题网


  有很多应用程序要求一起动就隐藏起来,这些程序多作为后台程序运行,希望不影响其他窗口,往往只在托盘区显示一个图标。这些程序通常都是对话框程序,而对话框在初始化的过程上与SDI、MDI的初始化是不同的,对话框只需要DoModule或者是CreateDialog等等对话框函数调用一次便可,SDI、MDI则要好几步才行。这样看来,对话框在使用方法上面是隐藏了不少细节的,其中就没有SDI、MDI所要求的 ShowWindow(nCmdShow)这一步。因此对话框要想一运行就隐藏,并不是很直接的。有一些方法可以做到这一点,下面我们就来看看几种方案。
  1.定时器
  最直观,又是最无奈的一个方法就是使用定时器。既然我们在对话框开始显示之前不能用ShowWindow(SW_HIDE)将其隐藏,那就给一个时间让它显示,完了我们在隐藏它。
  方法:
  1.在OnInitDialog()函数里设置定时器:(WINDOWS API里面响应消息WM_IN99vDIALOG)
  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(&.amp.wp).
  return TRUE.
  }
  在需要显示时(通常是响应热键或者托盘图标的鼠标消息):
  WINDOWPLACEMENT wp.
  wp.length=sizeof(WINDOWPLACEMENT).
  wp.flags=WPF_RESTORETOMAXIMIZED.
  wp.showCmd=SW_SHOW.
  SetWindowPlacement(&.amp.wp).
  这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示,还需加上如下代码:
  定义一个成员变量CRect rect.
  在OnInitDialog()里面:
  GetWindowRect(&.amp.rect).
  在需要显示的地方:
  SetWindowPos(&.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

相关文章


计算机二级C 单链表操:作交换节点计算机等级考试
拨号上网IP地址的检知计算机等级考试
C 中的IPv6网络程序设计计算机等级考试
C 对象是怎么死的?Win32线程篇计算机等级考试
VC中隐藏对话框窗口计算机等级考试
计算机二级C 辅导:自绘调色板计算机等级考试
C 的指针和引用探秘计算机等级考试
在C 中实现同步锁计算机等级考试
C 指针及其有关的问题计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛