windows編程---對話框

用過windows的對於對話框並不陌生,其主要用於完成特定的任務,是人機交互的一個方式。對話框可以分爲兩種:模態對話框和非模態對話框。

模態對話框也可分爲兩種,一種是系統方式的模態對話框,這種對話框只有當其結束時,你才能訪問其他窗口,例如單擊關機按鈕時,出現的包含待機,重啓,關機三個按鈕的對話框。一種是需然不能點擊父窗口,但可以點擊其他窗口的模態對話框。

用VC++創建的對話框模板解析:

ABOUTBOX DIALOG DISCARDABLE 32,32,180,100

STYLE DS_MODLEFRAME|WS_POPUP

FONT 8,"MS San Serif"

BEGIN

DEFPUSHBUTTON "OK",IDOK,66,80,50,14

ICON "ABOUT1",IDC_STATIC,7,7,21,30

CTEXT "About1“,IDC_STATIC,40,12,100,8

CTEXT "About Box Program",IDC_STATIC,7,40,166,8

CTEXT "(c) Charles Petzold,1998",IDC_STATIC,7,52,166,8

END

解釋:

(1):ABOUTBOX DIALOG DISCARDABLE 32,32,180,100。其中ABOUTBOX爲對話框模板的名稱,DIALOG爲關鍵字,DISCARDABLE關鍵字和前面其他資源意思相同。後面的4個數字,前面兩個數字爲左上角相對於父窗口客戶區的座標,後面兩個數字爲對話框的寬度和高度。注意這四個數字的單位不是像素,其中x座標方向的單位爲對話框中字體的寬度的1/4,y座標方向的單位爲對話框字體的高度的1/8.

(2):STYLE DS_MODLEFRAME|WS_POPUP。這條語句爲對話框的整體樣式。STYLE爲關鍵字。

(3):FONT 8,"MS San Serif"。這條語句爲字體的樣式和大小。

(4):當我們需要用窗口過程來對對話框的消息進行處理時,而不是用對話框過程來處理對話框消息時。我們需在對話框模板中添加語句:CLASS "類名"

(5):BEGIN和END之間爲對話框中的空間。這個例子中用到了三種控件:DEFPUSHBUTTON(按鈕),CTEXT(文本),ICON(圖標).其格式如下:

控件類型 "文本",ID,x,y,xWidth,yHeight,iStyle 其中的iStyle可以省略。一些常見控件類型的樣式和窗口類如下:

控件類型

窗口類 窗口樣式
PUSHBUTTON button BS_PUSHBUTTON|WS_TABSTOP
DEFPUSHBUTTON button BS_DEFPUSHBUTTON|WS_TABSTOP
CHECKBOX button BS_CHECKBOX|WS_TABSTOP
RADIOBUTTON button BS_RADIOBUTTON|WS_TABSTOP
GROUPBOX button BS_GROUPBOX
LTEXT static SS_LEFT|WS_GROUP
CTEXT static SS_CENTER|WS_GROUP
RTEXT static SS_RIGHT|WS_GROUP
ICON static SS_ICON
EDITTEXT edit ES_LEFT|WS_BORDER|WS_TABSTOP
SCROLLBAR scrollbar SBS_HORZ
LISTBOX listbox LBS_BOTIFY|WS_BORDER
COBOBOX combobox CBS_SIMPLE|WS_TABSTOP

1)上面的各種控件類型的樣式都包含如下樣式:WS_CHILD|WS_VISIBLE。注意:當需要去除上面默認包含的樣式時,可在iStyle使用NOT,當然也可以加入一些其他的類型。如去除EDITTEXT中的邊框:
EDITTEXT ID,x,y,xWidth,yHeight,NOT WS_BORDER

2)其中除去EDITTEXT,SCROLLBAR,LISTBOX,COMBOBOX外其格式都如下:

控件類型 "文本",ID,x,y,xWidth,yHeight,iStyle

其中EDITTEXT,SCROLLBAR,LISTBOX,COMBOBOX的格式都如下:

控件類型 ID,x,y,xWidth,yHeight,iStyle

注意:上面的格式也可以爲:

CONTROL "文本',ID,"窗口類",類型,x,y,xWidth,yHeight

3)當需要TAB鍵來移動控件的輸入焦點時,需在控件的樣式中使用WS_TABSTOP。使用WS_TABSTOP後,創建對話框後,windows會自動將輸入焦點定位到第一個具有WS_TABSTOP樣式的控件上,這樣可以用TAB鍵在具有WS_TABSTOP樣式的各個控件間移動。

4)當使用WS_GROUP樣式後,就可以使用方向鍵來移動輸入焦點。

模態對話框

模態對話框的創建使用DialogBox函數:

int DialogBox(HINSTANCE hlnstance,LPCTSTRIpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);

注意:其也可以運用DialogBoxParam函數來創建對話框,這個函數多了最後一個參數,其爲一個指針類型。

其中的第一個參數爲實例句柄,第二參數爲使用的對話框模板名,第三個參數爲產生對話框的窗口的句柄,第四個參數爲對話框過程,其格式如下:

BOLL CALLBACK ABOUTDLGPROC(HWND hlg,UINT message,WPARAM wparam,LPARAM lparam)
{

switch(message)
{

WM_INITDIALOG:

return TRUE;

WM_COMMAND:
{

switch(LOWORD(wparam))

{

WM_IDOK:

WM_IDCANCLE:

EndDialog(hlg,0);

return TRUE;

}

return FALSE;

}

對話框的結束使用EndDialog函數。其中第一個參數爲對話框的句柄,第二個參數爲一個整數,其會作爲DialogBox的返回值,我們可以通過這個值,對結果進行處理。通過這個窗口過程我們可以看到,當對話框過程對消息進行處理時,其會返回一個TRUE值,當不對消息進行處理時,會返回FALSE值,這是windows就會調用DefWindowProc函數對對話框過程沒有處理的消息進行處理。

對話框過程和窗口過程的區別(非模態對話框相同):

1):對話框過程的返回值爲BOOL值,而窗口過程的返回值爲LRESULT。

2):當窗口過程不對消息進行處理時,會調用DefWindowProc函數;當對話框不對消息進行處理時會返回FALSE值,否則返回TRUE值。

3):對話框不對WM_PAINT和WM_DESTROY消息進行處理,其也不會接收到WM_CREATE消息,其最先接收到得消息是WM_INITDIALOG。

模態對話框過程處理消息的過程:首先windows會把消息發送給對話框管理器DefDialogProc,DefDialogProc根據用戶需要調用對話框過程函數。對話框過程函數對消息進行處理時,返回TRUE值;如果不對消息進行處理,會返回FALSE值。如果DefDialogProc接收到得對話框過程函數返回的值是FALSE時,其會自己進一步處理或者調DefWindowProc

函數來班子處理,其處理完後會返回DefDialogProc,最後DefDialogProc會返回到windows。過程圖如下:

message windows

| |

DefDialogProc -------->DefWindowProc

對話框管理器 <--------用窗口過程函數進行處理

| 0|1

應用程序的對話框函數

非模態對話框

非模態對話框的創建運用CreateDialog函數:

HWND CreateDialog(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);

其中的參數和DialogBox的參數相同。也可以調用CreateDialogParam函數。

注意:非模態對話框產生的消息會進入消息隊列,因此可以在不同的窗口間切換。

非模態對話框和模態對話框的區別:

1):非模態對話框一般包含標題欄和系統菜單欄。這樣可以通過鼠標或者鍵盤通過點擊標題欄來移動對話框,以便對對話框下的內容好操作。而莫泰對話框由於不能對其他窗口進行操作,所以無需標題欄。

2):非模態對話框需我們用WS_VISIBLE或這調用ShowWindow函數來顯示對話框,而模態對話框無需我們明確指示。

3):非模態對話框的消息由windows產生,進入消息隊列,而模態對話框的消息不進入消息隊列,其由windows發出經對話框管理器,再到對話框過程。對於非模態對話框在用GetMessage獲取消息時必須對獲取的消息進行一些判斷,這樣才能保證獲取的消息能過被送到對話框處理函數。如下:

while(GetMessage(&msg,NULL,0,0))

{
if(hDlgModeless==0||IsDialogMessage(hDlgModeless,&msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

其中hDlgModelsee爲CreateDialog函數的返回值,如果CreateDialog函數創建對話框成功會返回對話框的句柄,否則返回0.IsDialogMessage(hDlgModeless,&msg)函數將消息發送到對話框過程函數,並返回TRUE(非零值),否則返回FALSE值.

注:非模態對話框的窗口過程和窗口過程的區別和模態對話框相同。結束對話框調用DestroyWindow函數。

WM_COMMAND消息中wparam的高字節爲子窗口ID,低字節爲通知碼,lparam爲子窗口句柄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章