基于MFC对话框隐藏的方法

基于MFC对话框隐藏的方法  

2009-08-14 14:32:14|  分类: 默认分类|举报|字号 订阅

1.定时方法

a.在OnInitDialog里设置一定时器

SetTimer(0);

b.在WM_TIMER里

ShowWindow(SW_HIDE);

KillTimer(0);

这种方法的缺点是显而易见的,使用定时器,使得程序的稳定性似乎打一个折扣;窗口是要先显示出来的,那么效果就是窗口闪了一下消失。

2.改变对话框显示属性可以让它隐藏起来

在OnInitDialog里

WINDOWPLACEMENT wp;

wp.length=sizeof(WINDOWPLACEMENT);

wp.flags=WPF_RESTORETOMAXIMIZED;

wp.showCmd=SW_HIDE;

SetWindowPlacement(&wp); //该函数设置指定窗口的显示状态和恢复,最大化,最小化位置

(本人强烈推荐此方法)

3.在WM_NCPAINT里

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);

5.改变Dialog Class Info 信息

a.在Dialog Class Info 里改Dialog为Window

b.重载OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)

   lpwndpos->flags= SWP_HIDEWINDOW;

由于基于MFC对话框隐藏问题对于初学者来说是有一定难度的,甚至认为只要ShowWindow(SW_HIDE)这样就可以了,其不知由于MFC为了达到信息的封装而隐藏了很多细节,从而使我们"错过"了在该显示(或隐藏)的地方和机会.

你可能感兴趣的:(基于MFC对话框隐藏的方法)