對話方塊分為模態對話方塊和非模態對話方塊。模態對話方塊是指只有其銷毀後,才能對其父視窗
進行操作的對話方塊;而非模態則無此要求。本博文將會介紹下模態對話方塊的資源定義與使
用。
一、基本知識
對話方塊主要是用來進行和使用者互動的,其存在可以使得主視窗更加簡潔。對話方塊也是基於
視窗的。但Windows的封裝使得建立對話方塊比建立視窗簡單的多。
下面看看建立視窗、模態對話方塊與非模態對話方塊的異同:
從可以發現以下幾點:
1、建立對話方塊無需註冊類,不用調用建立、顯示和重新整理視窗的函數了。
2、普通視窗和非模態對話方塊要自訂訊息迴圈,而模態對話方塊則不需要了。
3、對話方塊對對話方塊過程的調用更加間接了。
4、建立模態對話的函數是DialogBoxParam,建立非模態對話方塊的函數是CreateDialogParam。
二、定義資源與使用對話方塊
從中可以明顯的看出建立對話方塊只要調用DialogBoxParam。另外,對要特殊處理的訊息也
要在自訂的對話方塊過程中處理。
是像上面說的那樣嗎?是的,但不足以用來編程!
接著看:
首先,對話方塊是作為一種資源存在在的。所以,得在資源檔內定義對話方塊。這就相當於定義了
對話方塊的模版,並且,模態與非模態對話方塊的資源定義無差別。差別在於建立時調用不同的函數。
其次,根據可以看到建立模態對話方塊,Windows內部為我們建立了內建訊息迴圈、內建視窗
過程。我們在調用DialogBoxParam時,這個函數直到對話方塊的銷毀才會返回。另外,在調用時
也指定了資源檔中的對話方塊模版,Windows根據模版建立對話方塊。這裡也不需要我們關心。
;建立模態對話方塊,一直到對話方塊銷毀函數才返回;DLG_MAIN就是資源檔中的對話方塊invokeDialogBoxParam,hInstance,DLG_MAIN,\NULL,offset _ProcDlgMain,NULL
(1)、對話方塊資源定義
1、
對話方塊ID dialog [ discardable ] x座標,y座標,寬度,高度
[ 可選屬性 ]
begin
子視窗控制項
end
其中,可選屬性只要有標題文字、視窗風格、字型等;而子視窗控制項包括表徵圖、按鈕等。
2、執行個體
#include<resource.h>#defineICO_MAIN0x1000#defineDLG_MAIN1//定義表徵圖ICO_MAINicondiscardable"Main.ico"//定義對話方塊DLG_MAINdialogdiscardable50,50,113,63//對話方塊屬性定義styleWS_VISIBLE | WS_CAPTION | DS_MODALFRAME | WS_SYSMENUcaption"Dialog"font9,"宋體"//子視窗控制項定義BEGINiconICO_MAIN,-1,10,11,18,21ctext"Dialog example\nby lulipeng",-1,36,14,70,19defpushbutton "Exit(&X)",IDOK,58,46,50,14control "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,39,103,1END
(2)、使用
1、在DialogBoxParam函數的參數中指定資源即可。
2、執行個體
.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.libICO_MAINequ1000hDLG_MAINequ1.data?hInstancedd?.code_ProcDlgMainprocuses ebx edi esi hWnd,uMsg,wParam,lParammoveax,uMsg.ifeax == WM_CLOSE ;對話方塊要用EndDialog銷毀 invokeEndDialog,hWnd,NULL.elseifeax == WM_INITDIALOG;設定表徵圖invokeLoadIcon,hInstance,ICO_MAINinvokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,eax.elseifeax == WM_COMMANDmoveax,wParam.ifax == IDOKinvokeEndDialog,hWnd,NULL.endif.else;自訂的對話方塊過程沒有處理訊息,要向;對話方塊管理器返回FALSE,否則返回TRUEmoveax,FALSEret.endifmoveax,TRUEret_ProcDlgMainendpstart:invokeGetModuleHandle,NULLmovhInstance,eax;建立模態對話方塊,一直到對話方塊銷毀函數才返回;DLG_MAIN就是資源檔中的對話方塊invokeDialogBoxParam,hInstance,DLG_MAIN,\NULL,offset _ProcDlgMain,NULLinvokeExitProcess,NULLendstart
三、代碼中表徵圖 "Main.ico" 下載
Main.ico
四、代碼運行結果