用VC制作动态弹出的对话框

来源:互联网 发布:php前端页面 编辑:程序博客网 时间:2024/06/02 17:00
一、选择方法
   通常,我们可以在对话框的WM_INITDIALOG事件的响应函数中加入对话框的一些初始化设置,比如改变窗口的位置及大小。同样,我们也可以在WM_INITDIALOG事件的响应函数中让对话框由小到大地显示。但是,如何改变对话框的大小呢?在编程过程中,我们通常是利用MoveWindow函数来动态调整对话框的大小,但是MoveWindow函数有其局限性:一是它的速度较慢;二是由于众所周知的MFC内存泄漏的原因,如果重复调用MoveWindow函数来改变对话框的大小,MoveWindow不能够将屏幕清“干净”(这点你可以在实际编程中试一下),这显然不是我们所需要的。能不能找到一种其他的方法来快速地改变窗口大小呢?我们知道,用SetWindowRgn函数能够改变窗口的显示区域,那么,在对话框显示之前,让程序将对话框先隐藏起来,然后让对话框的显示区域不断变大,这样就实现了对话框的动态显示。

   在继续介绍之前,我们先来介绍一下SetWindowRgn的具体用法,以下是其调用格式:

   int SetWindowRgn( HRGN hRgn, BOOL bRedraw );

   hRgn:指向一区域的句柄,通常该参数是由CRgn对象创建的。

   bRedraw:指明在设定窗口显示区域之后系统是否进行窗口重绘操作。

   二、应用实例
   接下来我们以让程序的“帮助对话框”动态弹出为例,介绍如何通过编程的方式来实现对话框的动态弹出显示。在CAboutDlg类中加入对WM_INITDIALOG的映射,并编辑其响应函数OnInitDialog,该函数的具体内容设置如下:

   BOOL CAboutDlg::OnInitDialog()

   {

   CDialog::OnInitDialog();

   //隐藏对话框

   ShowWindow(SW_HIDE);

   CRect dlgRect;

   GetClientRect(&&dlgRect);

   CPoint centerPoint;

   centerPoint.x=dlgRect.Width()/2;

   centerPoint.y=dlgRect.Height()/2;

   //得到对话框的中点坐标

   CRgn testrgn;

   this-〉ShowWindow(SW_HIDE);

   int m=GetSystemMetrics(SM_CYSIZEFRAME);

   //以下代码实现对话框的动态弹出

   for (int i=10;i〈dlgRect.Width()/2+2m;i+=1)

   {

   testrgn.CreateRectRgn(centerPoint.x-i,centerPoint.y-i,centerPoint.x+i,centerPoint.y+i);

   SetWindowRgn((HRGN) testrgn,TRUE);

   ShowWindow(SW_SHOW);

   CenterWindow();

   testrgn.DeleteObject();

   }

   return TRUE;

   }

   该程序的代码比较简单,编译之后进入程序的帮助选单,你会看见一个由小变大的对话框跃然于屏幕之上。

原创粉丝点击