第四篇 對話方塊的建立與使用

來源:互聯網
上載者:User

對話方塊分為模態對話方塊和非模態對話方塊。模態對話方塊是指只有其銷毀後,才能對其父視窗

進行操作的對話方塊;而非模態則無此要求。本博文將會介紹下模態對話方塊的資源定義與使

用。

 

一、基本知識

對話方塊主要是用來進行和使用者互動的,其存在可以使得主視窗更加簡潔。對話方塊也是基於

視窗的。但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

 

四、代碼運行結果

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.