一、選擇方法
通常,我們可以在對話框的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();
file://隱藏對話框
ShowWindow(SW_HIDE);
CRect dlgRect;
GetClIEntRect(&&dlgRect);
CPoint centerPoint;
centerPoint.x=dlgRect.Width()/2;
centerPoint.y=dlgRect.Height()/2;
file://得到對話框的中點坐標
CRgn testrgn;
this-〉ShowWindow(SW_HIDE);
int m=GetSystemMetrics(SM_CYSIZEFRAME);
file://以下代碼實現對話框的動態彈出
for (int i=10;i〈dlgRect.Width()/2+2m;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;
}
該程序的代碼比較簡單,編譯之後進入程序的幫助選單,你會看見一個由小變大的對話框躍然於屏幕之上。
三、深入討論
需要說明的是,本文中主要的目的是介紹編程思路,所以在編程中是首先假定了幫助對話框是正方形或基本上是正方形的,如果你的幫助對話框的形狀長寬比例較大,該程序在運行時的界面效果會不太理想。這時,你可以在編程中考慮按對話框的長寬比例來動態創建其他形狀的顯示區域。