官术网_书友最值得收藏!

第2章 Windows通用控件和對話框編程

2.1 控件概述

控件是放在對話框上的元素,如文本框、標記框、列表框、按鈕、進度指示器和滑塊等。控件的引入使Windows編程相對DOS編程大大簡化,極大地減輕了編程人員的負擔。

2.1.1 控件的添加和移除

在編輯窗口的旁邊有一個控制面板,如圖2.1所示,這個控制面板提供了Window常用的通用控件。

圖2.1 控件面板

若用戶看不到控制面板,請在集成開發環境中工具欄區域的空白處單擊鼠標右鍵,并在隨之彈出的菜單中選中Controls項。

在控制面板上用鼠標選擇一個控件,然后在對話框中單擊鼠標左鍵,則相應的控件就被放到了對話框模板中。當用鼠標選擇控件時,會出現一個圍繞它的虛框,拖動虛框的邊界可以改變控件的大小。控件可以被拖動,在拖動過程中,若按住Ctrl鍵,則控件會被復制。

用戶一次選擇多個控件的方法有兩種:

● 在對話框的空白處拖動鼠標,則拖出來的虛線框內的控件將被選中。

● 在選擇控件時按住Ctrl鍵,則可以多重選擇。

移除控件的方法是先選中再按Delete鍵。

2.1.2 控件的屬性

選中某個控件后按回車鍵,都會彈出一個屬性對話框,屬性對話框用來設置控件的各種屬性。屬性對話框是標簽式對話框,不論哪種控件,其第一頁都是常規屬性(Gerneral)。一個典型的控件屬性對話框如圖2.2所示。

圖2.2 控件屬性對話框

在控件屬性對話框的常規屬性中,有一些控件共有的屬性:

● ID屬性:用于指定控件的標志符(類似菜單ID), Windows系統和應用程序依靠ID來區分不同的控件。

● Caption屬性:靜態文本、分組框、按鈕、檢查框、單選按鈕等控件可以顯示標題,用來對控件進行文字說明。控件標題中的字符&使緊跟其后的字符增加下畫線,按Alt+下畫線字母將啟動該控件。

● Visible屬性:用來指定控件是否可見,默認情況下此復選框被選中。

● Disable屬性:使控件允許或禁止,禁止的控件呈灰色顯示,不能接收任何輸入。

● Group屬性:用來指定一組控件,用戶可以用箭頭鍵在該組控件內移動。在同一組內的單選按鈕具有互斥的特性。如果一個控件具有Group屬性,則這個控件以及按Tab順序緊隨其后的所有控件都屬于一個組的,直到遇到另一個有Group屬性的控件為止。

● Tab Stop屬性:用戶可以按Tab鍵移動到具有Tab Stop屬性的控件上。Tab移動的順序可以由用戶指定。按Ctrl+D組合鍵可以顯示對話框中所有控件的Tab順序。默認的Tab順序是控件的創建次序。

2.2 常用控件

2.2.1 靜態文本框

靜態文本框是一種靜態控件。靜態控件上面可以顯示字符串、矩形、圖標、光標、位圖以及元文件等,常用來作為其他控件的標簽,也可以作為容器容納其他控件。靜態文本框使用戶無須編寫代碼就可以方便地在靜態控件上顯示字符串。靜態文本框的屬性主要包括:

● Caption:靜態文本框上所顯示的字符串。

● Align text:文本框上字符串的對齊方式。

● Center vertically:豎直方向的居中對齊。

● No Wrap:顯示文本到達控件邊界時是否換行。

● Sunken:文本框凹陷顯示。

● Border:給文本框加一個黑邊框作為邊界。

靜態控件由MFC類庫中的Cstatic類來管理,它是窗口類CWnd的子類。

Cstatic的主要成員函數如下:

● SetBitMap:設置要在靜態控件上顯示的位圖,參數是位圖句柄,返回以前與控件相聯系的位圖句柄。

● GetBitMap:得到通過函數SetBitMap設置的與控件相關聯的位圖句柄。

● SetIcon:設置要在靜態控件上顯示的圖標,參數是圖標句柄,返回以前與控件相聯系的圖標句柄。

GetIcon:得到通過函數SetIcon設置的與控件相關聯的圖標句柄。

SetCursor:設置要在靜態控件上顯示的光標,參數是光標句柄,返回以前與控件相聯系的光標句柄。

使用上述函數要注意,要想讓靜態文本框顯示某種類型的對象,必須設置靜態文本框本身的相應屬性,比如調用SetBitMap顯示位圖時要設置CStatic的SS_BITMAP屬性。一個靜態文本框通常不會接受鼠標和鍵盤輸入,但是如果在屬性對話框中設置了其Notify屬性,當鼠標單擊時,它會給父窗口一個BN_CLICKED事件通知。

2.2.2 編輯文本框

編輯框主要用于在程序中輸入文本,它的功能由CEdit類來實現。編輯框的主要功能和屬性如下:

● Multi_line:多行編輯框。

● AutoHScroll:如果設此屬性,當用戶輸入的文本框到達控件邊界時,控件自動水平滾動,允許用戶輸入更多內容。

● Number:只允許輸入數字。

● Password:輸入的任何字符都顯示成“*”號。

● Uppercase/Lowercase:所有的輸入字符都顯示成大寫/小寫。

CEdit類的常用成員函數如下:

● GetSel:獲得文本框控件中當前選擇的起始字符和終止字符位置。

● SetSel:選擇文本框控件中的一個字符范圍。

● Undo/Clear/Copy/Cut/Paste:剪貼板操作。

當用戶對編輯框進行操作時,編輯框會發送相應得控件通知消息給父窗口,這些編輯框控件通知消息主要有

● EN_UPDATE:控件即將改變之后的文本內容。

● EN_CHANGE:控件文本內容改變了。

● EN_SETFOCUS:控件即將獲得輸入焦點。

● EN_KILLFOCUS:控件即將失去輸入焦點。

● EN_MAXTEXT:控件已經不能再接受輸入焦點,新的輸入被刪除。

2.2.3 按鈕

在Windows系統中,按鈕、復選框、單選框、分組框這4個控件都是由MFC類CButton來管理的,可統稱為按鈕控件。如何在一個CButton中區分這些不同形態呢?這就要通過按鈕風格來區分。CButton類對象中BS_CHECKBOX、BS_GROUPBOX、BS_PUSHBUTTON和BS_RADIOBUTTON分別表示復選框、分組框、普通按鈕和單選框。CButton的成員函數SetButtonStyle、GetButtonStyle分別用來在程序中設置和得到按鈕的風格。

按鈕控件的重要屬性有

● Caption:按鈕上所有顯示的文本。

● Multiline:如果按鈕上要顯示的文本長度超過了控件本身的長度,則文本分成多行顯示。

● Icon:按鈕上顯示一個圖標。

● Bitmap:按鈕上顯示一個位圖。

● Horizontal/Vertical alignment:標題文本的水平/豎直對齊方式。

CButton類的常用成員函數如下:

● GetState:獲得按鈕的狀態。

● SetState:設置按鈕的狀態。

● SetCheck/GetCheck:設置/獲得按鈕的選擇狀態。

● SetButtonStyle/GetButtonStyle:設置/獲得按鈕的風格。如把一個普通按鈕變成復選框可以這樣:SetButtonStyle(BS_CHECKBOX)。

按鈕控件只有兩個通知消息:BN_CLICKED和BN_DOUBLECLICKED,分別表示按鈕被單擊和雙擊。

2.2.4 列表框

列表框是一個項目列表,供用戶選擇和瀏覽。它分為單選列表框和多選列表框。對于前者,用戶只能選擇其中的一個項目;而對于后者,用戶可以通過Ctrl和Shift鍵選擇多個。

列表框由MFC類CListBox來管理,它的主要成員函數如下:

● GetCount:獲得列表框中項目的個數。

● SetItemData/GetItemData:設置/獲得與一個項目相聯系的32位整數值。

● GetSel:判斷一個項目是否被選中。

● SetSel:在一個多選列表框中選擇一個項目或把一個項目取消選擇。

● SetCurSel/GetCurSel:在單選列表框中選中一個項目/獲得一個被選中項目的項目索引。

● GetSelCount:在一個多選列表框中得到當前被選中的項目數。

● GetSelItems:獲得多選列表框中所有被選中的項目索引,存放在一個整數緩沖區中。

● GetText:根據項目索引,得到相應得項目字符串。

● AddString:向列表框增加一個字符串項目,增加的位置是在最后。

● InsertString:根據參數,在列表框某項目的后面插入一個字符串項目。

● ResetString:刪除列表框所有項目。

● DeleteString:從列表框刪除一個字符串項目。

● Dir:把當前目錄下所有文件加入列表框顯示。

給列表框增加項目通常在對話框的OnInitDialog函數中對列表框的項目進行初始化。

2.2.5 組合框

組合框是列表框與靜態框或列表框與編輯框的結合。組合框共有三種風格:

● Simple:列表框與編輯框的結合,并且列表框始終顯示在下面。

● Dropdown:也是列表框與編輯框的結合,但列表框平時不顯示出來,需單擊下拉按鈕方可顯示。

● DropList:列表框與靜態控件的組合,列表框平時不顯示出來。

組合框的功能由MFC類CComboBox來實現,它的主要成員函數如下:

● GetCount:獲得組合框的列表框中項目的數目。

● SetCurSel/GetCurSel:在組合框列表框中選中一個項目/獲得被選中的項目索引。

● SetEditSel:設置組合框編輯控件中的字符。

● GetEditSel:獲得組合框的編輯控件中當前選擇的首尾字符位置。

● GetLBText:根據項目索引,得到列表框部分的相應項目字符串。

● Clear/Copy/Cut/Paste:組合框編輯框部分的剪貼板操作函數。

● AddString:在組合框列表框的尾部添加一個字符串。

● InsertString:在組合框列表框中插入一個字符串。

● DeleteString:從組合框列表框中刪除一個字符串。

● ResetContent:刪除列表框中所有的項目。

組合框的控件通知消息有:CBN_DBLCLK(鼠標雙擊)、CBN_DROPDOWN(列表框被下拉)、CBN_SELCHANGE(列表框中選擇的行發生改變)、CBN_EDITUPDATE(輸入框中內容被更新)、CBN_CLOSEUP(列表框部分關閉)、CBN_EDITCHANGE(用戶改變了編輯框的內容)等。

2.2.6 進度條

進度條用來顯示一個長時間的操作進度,進度條的主要參數是它的范圍(range)和當前進度位置(position),范圍代表整個耗時操作,當前位置代表操作進行到了哪一步。進度條由類CProgressCtrl來管理,其成員函數如下:

● SetRange:用short類型的整數設置進度條范圍。

● GetRange:獲得進度條的范圍。

● SetPos/GetPos:設置/獲得進度條當前位置。

● OffsetPos:通過增量來設置進度條的進度位置。

● StepIt:在當前位置基礎上增加一個增量并重新顯示進度條,這個增量由SetStep函數設置。

進度條在一個線程中被控制,在一個耗時操作開始之前,調用SetRange設置范圍,當操作進行到某一步時,程序調用SetPos、OffsetPos、StepIt讓進度條顯示新的位置。

2.3 通用對話框

作為操作界面的對話框的實現是由對話框模板資源和與之相關聯的對話框類兩部分組成的。其中對話框模板資源的作用是確定一個對話框的外形、尺寸、控件(用于交互操作)的組成、分布和標志。對話框類的作用是為該對話框提供屬性和各種操作,以便在程序中需要使用該對話框提供操作界面時,創建該對話框類的對象,并通過該對象操作該對話框,實現在該對話框界面中進行所需要的交互操作。

Visual C++為程序中所需要的各類資源的制作提供了一個WYSWYG(即見即得)的資源編輯器。由該編輯器制作生成的所有資源都被以文本形式記錄在一個的資源文件(.rc)中,例如,在本書的實例《簡單人事信息管理程序》中的PersonnelMIS.rc。對話框模板的制作內容和步驟如下所示。

2.3.1 添加一個對話框模板

1.添加方法

在工作空間(Workspace)中選擇ResourceView卷標,然后用鼠標右鍵單擊工作空間中的總目錄標題PersonnelMIS resource,彈出一個浮動菜單,如圖2.3所示。

圖2.3 浮動菜單

在該菜單中選擇Insert…項,隨后在主編輯窗口中彈出一個資源類型選擇對話框,以便從中選定需要插入的資源如圖2.4所示。

圖2.4 資源類型選擇對話框

在該對話框中用鼠標左鍵單擊Dialog項(選中要插入的資源為對話框),然后單擊按鈕New或直接用鼠標左鍵雙擊Dialog項,即可在資源文件中加入一個默認的對話框范本(框架),如圖2.5所示。

圖2. 5 在資源文件中加入一個默認的對話框范本

在所顯示的默認對話框模板中,可以按照你所設計的交互操作的需要,對添加的對話框模板進行必要的編輯。主要的編輯操作包括:修改對話框的標志和標題,修改對話框的尺寸,選擇對話框中的字體,添加所需要的控件,編輯每個控件的標題、尺寸等,安排控件在對話框中的位置、布局和Tab鍵順序等。下面以《簡單人事信息管理程序》中的“人員信息選擇對話框模板”為例,描述這些編輯操作。

(1)調整對話框模板的尺寸

使用鼠標移動光標對模板的右邊框和下邊框進行(按住鼠標左鍵)拖拽,可以將對話框模板的尺寸擴大或縮小到要求的大小。

(2)修改按鈕控件<OK>和<Cancel>在對話框模板中的分布

先將要改變分布狀態的<OK>和<Cancel>按鈕控件全部選中,然后選擇菜單命令Layout→Arrange Buttons→Bottom(快捷鍵Ctrl + Shift + B),將這兩個按鈕的分布從默認的右分布改為底分布,如圖2.6所示。

圖2.6 修改按鈕控件在對話框模板中的分布

(3)修改對話框模板的標識和標題

選中對話框模板,單擊鼠標右鍵,彈出如圖2.7所示的環境菜單。

圖2.7 環境菜單

在此菜單中選擇菜單項Properties,彈出如圖2.8所示的模板屬性編輯對話框。

圖2.8 模板屬性編輯對話框

注意,由于該屬性編輯對話框可以用于編輯對話框模板和模板中任何控件的屬性,所以一般可以單擊該屬性編輯對話框右上角的保持按鈕 使該按鈕的形態變為 以便該屬性編輯對話框用于對不同資源編輯時保持顯示。

對話框模板IDD_DIALOG1屬性的編輯操作如下:

① 將ID編輯框中的范本標志IDD_DIALOG1修改為IDD_PERSON_ID_SEL_DLG。

② 將Caption編輯框中的對話框模板標題“Dialog”修改為“人事信息選擇對話框”。

③ 如果需要,可以單擊<Font…>按鈕選擇對話框模板中所使用的字體。本例將范本中所有的文本字體選定為“宋體”9號字,如圖2.9所示。

圖2.9 編輯IDD_DIALOG1屬性

注意:對話框模板標志的命名雖然是任意的,但推薦以IDD_為前綴,后面的部分按照見名知意的原則命名,例如,本例中的IDD_PERSON_ID_SEL_DLG(注意,大寫)。對話框的屬性很多,如果要了解這些屬性的作用和修改方法,可以單擊 有關按鈕顯示的幫助信息,這里不再一一介紹。

(4)添加需要的控件

在控件選擇工具欄中選擇所要添加的控件(移動光標在任意一個控件按鈕的右下角停留片刻,便會顯示該控件類型名稱的卷標),便可以通過鼠標在對話框模板中繪制所選擇的控件。在本例中,需要為對話框模板IDD_PERSON_ID_SEL_DLG添加兩個靜態文本框控件(Static Text)和一個文本編輯框控件(Edit Box)。控件的尺寸可以通過鼠標對控件的邊框進行擴大或縮小完成,控件的分布位置可以通過鼠標拖拽放置在需要的位置,而控件的標志和標題也要通過屬性編輯對話框進行修改(方法與對對話框模板屬性的修改類似)。本例中的控件的添加過程如下所述。

① 添加靜態文本框控件,用于顯示操作提示。一般情況下靜態文本框控件不需要修改默認的標志,只需要編輯其標題,本例中將該靜態文本控件的標題編輯為“請輸入要選擇人員的身份證號”(注意,編輯時必須先選中要編輯的控件)。該靜態文本框控件水平位置還可以通過選擇菜單命令Layout→Center inDialog→Horizontal(快捷鍵Ctrl + Shift + F9)所指示的功能,將該控件放置在對話框水平方向的中央位置,如圖2.10所示。

圖2.10 設置靜態文本框控件的位置

② 修改靜態文本控件的標題為水平和垂直中央對齊的顯示風格(Style),如圖2.11所示。

圖2.11 修改靜態文本控件的標題風格

③ 添加文本編輯框控件,用于程序運行時,用戶通過鍵盤輸入要查詢人員的身份證號。通過鼠標修改該文本編輯框控件的尺寸、分布位置(方法同前)。通過屬性編輯對話框將文本編輯框控件的標志修改為IDC_ID(其他屬性均使用默認屬性),如圖2.12所示。

圖2.12 添加文本編輯框控件

④ 添加靜態文本框控件,為用于輸入身份證號的文本編輯框增加提示。該靜態文本框控件的添加方法與前相同,將該靜態文本框控件的標題修改為“身份證號”。

⑤ 通過菜單命令Layout→Align→Top Ctrl+Up Arrow或相應的工具欄按鈕,使添加的靜態文本框控件與所提示的文本編輯框控件頂邊對齊。然后通過菜單命令Layout→Make Same Size→Height或相應的工具欄按鈕,使這兩個控件的垂直尺寸相同,如圖2.13所示。

圖2.13 設置控件的位置

以上所有添加的控件的ID(標志)、標題、類型和用途歸納在表2.1中。

表2.1 控件的ID(標志)、標題、類型和用途

注意:控件標志的命名雖然是任意的,但推薦以IDC_為前綴,后面的部分按照見名知意的原則命名,例如,本例中的IDC_ID(注意要大寫)。上述添加控件的其他屬性使用默認值。

至此,人員信息選擇對話框模板資源的添加操作完成。

2.3.2 相關對話框類的定義

對話框模板只為GUI交互界面定義了界面的大小、用于交互操作的控件的種類、數量、分布位置等。而使用該交互界面進行各類操作是通過各種相應API(Application Programming Interface)功能函數實現的。在微軟的Windows操作平臺上使用MFC的面向對象的程序設計中,這些功能和描述對話框交互界面的屬性被封裝在一個被稱為CDialog的基類中,該類為所有需要通過對話框界面進行的交互的類設計提供了與對應的對話框模板相關聯的能力以及統一的操作界面。因此,用戶自定義的對話框類只需要從CDialog中派生,然后根據所設計的交互操作的特殊性,適當地增加一些屬性,成員函數和(或)對CDialog定義中的虛函數進行重新定義即可,大大方便了面向對象的程序設計。下面我們以“人員信息選擇對話框模板”IDD_PERSON_ID_SEL_DLG相關聯的自定義對話框類CPersonInfSelDlg為例敘述自定義對話框類的定義方法和步驟。

1.創建自定義對話框類

使用ClassWizard創建與一個指定的對話框模板相關聯的自定義對話框類比較方便的方法是:在資源編輯器中,選中需要定義關聯對話框的模板IDD_PERSON_ID_SEL_DLG,單擊鼠標右鍵,彈出一個環境菜單,選擇菜單項“ClassWizard…”,如圖2.14所示。

圖2.14 選擇菜單項ClassWizard…

如果與該指定的對話框模板關聯的對話框還沒有創建,則會顯示如圖2.15所示的提示對話框。

圖2.15 提示對話框

對于該提示,可能的響應可分為三種情況:

① 如果不準備創建一個以CDialog為基類的自定義對話框類與該對話框模板關聯,而在程序中直接使用CDialog定義與該對話框模板關聯的對話框對象,則單擊<Cancel>按鈕,退出該提示。

② 如果準備將該對話框模板與一個已經存在的自定義類相關聯,則選中Select an existing class單選按鈕后,單擊<OK>按鈕,在隨后列出的已存在的自定義類中選擇要關聯的類。

③ 通常情況下,都會創建一個以CDialog為基類的自定義對話框類與該對話框模板關聯,即在默認狀態下(單選按鈕Create a new class被選中),單擊<OK>按鈕,彈出如圖2.16所示的創建新類的操作界面。

圖2.16 創建新類的操作界面

在該界面中,要創建的自定義新類的默認基類是CDialog,默認范本是要關聯的對話框模板。雖然基類的種類和關聯的對話框模板也可以重新選擇,但一般情況都使用默認選定。因此,創建新類的操作只需要在新類名(Name)的文本編輯框中輸入欲定義的自定義對話框類的名稱,在本例中該類名為CPersonInfSelDlg。如果不修改所創建類的源代碼文件名,則該類的定義文件為PersonInfSelDlg.h,實現文件為PersonInfSelDlg.cpp。單擊<OK>按鈕,則將新創建的自定義對話框類的信息顯示在如下MFC ClassWizard(類向導)操作界面中,以便對所創建的新對話框類進行各種成員的添加工作。退出此操作界面,可在工作區窗口的ClassView中查看到,此時CPersonInfSelDlg類的定義中只有類對象構造函數和一個重新定義的基類虛函數DoDataExchange,如圖2.17所示。

圖2.17 MFC ClassWizard操作界面

2.添加數據成員

對話框類的主要用途是提供信息交互的界面,而一個信息的交互都是通過某一個特定的控件實現的,例如,本例中的人員身份證號就是通過身份證號文本編輯框控件進行輸入/輸出交互操作的。因此,在自定義對話框類中,添加與交互控件相關聯的數據成員,以便在程序中完成輸入/輸出交互操作,是十分必要的,一般情況下是必不可少的。為交互控件添加相關數據成員的操作是在類向導操作界面MFC ClassWizard中完成的,進入該界面的方法有兩種:

① 在IDD_PERSON_ID_SEL_DLG模板上單擊鼠標右鍵,彈出一個環境菜單,選擇菜單項ClassWizard…。

② 通過主菜單命令View→ClassWizard。

在MFC ClassWizard中選中CPersonInfSelDlg類,并選擇Member Variables標簽,進入數據成員添加操作界面,如圖2.18所示。

圖2.18 數據成員添加操作界面

為文本編輯控件IDC_ID添加數據成員:選中該控件ID后,單擊<Add Variable…>按鈕或雙擊該控件ID,便進入添加數據成員操作界面(Add Member Variable),如圖2.19所示。

圖2.19 數據成員操作界面

為控件添加的數據成員有兩類:

● 數值數據成員(Value)——用于數據交換(輸入/輸出)。

● 控件對象成員(Control)——用于對控件本身的操作。

本例中,只為文本編輯控件IDC_ID添加數值數據成員。所添加的數值數據成員的類型還可以根據通過該控件所交換的數據的需要有多種選擇,如圖2.20所示。

圖2.20 數據類型的多種選擇

在本例中,由于身份證號是字符串,所以選擇CStirng類型最為方便。在數據成員名編輯框中為所添加的數據成員命名,例如,為IDC_ID添加的CString類型的數據成員命名為m_Id。單擊<OK>按鈕確認所添加的數據成員,退出操作界面,返回類向導操作界面(MFC ClassWizard),如圖2.21所示。

圖2.21 返回類向導操作界面

對于有些類型的數值數據成員,允許附加對數據的某些確認限定條件。例如,本例中對CString類型的數據成員m_Id設置了最大字符個數Maximum Characters為18個ASCII字符。注意,只有單擊<OK>按鈕結束MFC ClassWizard,才能保證前面的添加操作被確認,否則如果單擊<Cancel>按鈕結束MFC ClassWizard,則會使所本次做的添加操作全部被取消。表2.2中歸納了在自定義對話框中所添加數據對象的名稱、關聯控件、類型、限定和用途。

表2.2 數據對象的說明

一次成功數據成員添加操作,如添加m_Id,會導致該對話框的定義和實現文件中增加如下的代碼:

① 在CPersonInfSelDlg的定義增加:

            CString m_Id;

② 在成員函數CPersonInfSelDlg::DoDataExchange的定義中增加:

            DDX_Text(pDX, IDC_ID, m_Id); // 根據 pDX 的交互方向:輸入時將控件 IDC_ID
                                            // 中的字符串讀入m_Id中,輸出時將m_Id中保
                                            // 存的字符串寫入控件IDC_ID中。
            DDV_MaxChars(pDX, m_Id, 18); // 確保通過 IDC_ID 交換的字符串長度不超過 18
                                            // 個ASCII字符。

注意:成員函數DoDataExchange不能被直接調用,而是通過調用CDialog的成員函數UpdateData間接被調用。

UpdateData的原型如下:

            BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
                參數bSaveAndValidate = TRUE時,數據從控件讀到與控件相關的數據成員中;
                參數bSaveAndValidate = FALSE時,數據從數據成員寫到與數據成員相關的控件中。

③ 在構造函數的定義中增加:

            m_Id = _T("");          // 對數據成員的初始化設置

3.添加成員函數

自定義對話框類中是否需要添加其他成員函數,是由該對話框在創建、顯示、操作中的特定需要確定的。在自定義對話框類添加的成員函數大致可以分為以下四種。

(1)重載基類的虛函數

用于對話框統一界面消息的多態響應時,實現自定義對話框的特定操作。這類函數的典型是DoDataExchange。如果需要重載基類的其他虛函數,則可以通過下述方法和步驟。

① 在ClassView中,通過選中類的環境菜單選擇添加該類的基類虛函數,如圖2.22所示。

圖2.22 添加該類的基類虛函數

② 在彈出的虛函數重載界面中,選擇要重載的基類虛函數,如圖2.23所示。

圖2.23 選擇要重載的基類虛函數

選中要重載的基類虛函數(該函數從左側窗口移動到右側窗口)后,單擊<Edit Existing>按鈕進入被重載的虛函數的定義的編輯窗口,以便為該函數添加代碼。

(2)對話框窗口的消息響應函數

這類函數的典型是對話框窗口初始化消息響應函數OnInitDialog。添加該函數的目的是在對話框窗口創建成功且對話框顯示之前,對對話框中的控件進行特定的初始化。圖2.24以OnInitDialog的添加為例,展示這類函數的添加方法和步驟:

① 在MFC ClassWizard界面中的“Class name:”類名選擇欄中,選定需要添加窗口消息響應函數的類,例如,CPersonInfSelDlg。在“Object IDs:”對象標志列表中選擇被選中的類名CPersonInfSelDlg。

② 在MFC ClassWizard界面中的“Message:”消息列表窗口中,選擇要響應的窗口消息。例如,WM_INITDIALOG。

③ 單擊<Add Function>按鈕或雙擊選中的消息項,便會在“Member Functions”成員函數列表窗口中增加了該消息的響應函數。例如,OnInitDialog。

④ 單擊<Edit Code>按鈕,進入消息響應函數定義的編輯窗口(如圖2.24所示),以便為該函數添加代碼。

圖2.24 添加消息響應函數OnInitDialog

(3)控件的消息響應函數

以<OK>按鈕的消息響應函數為例說明這類函數的添加方法和步驟:

① 在MFC ClassWizard界面中的“Class name:”類名選擇欄中,選定需要添加控件消息響應函數的類,例如,CPersonInfSelDlg。在“Object IDs:”物件標志列表中選擇被選中控件的標志,如IDOK,如圖2.25所示。

圖2.25 選擇控件標志

② 在MFC ClassWizard界面的“Message:”消息列表窗口中,選擇要響應的控件消息,例如BN_CLICKED(按鈕單擊消息)。

③ 單擊<Add Function>按鈕或雙擊選中的消息項,便會彈出一個添加消息響應函數的對話框,如圖2.26所示。

圖2.26 添加消息響應函數

④ 單擊對話框的<OK>按鈕確定添加,則會在下方的“Member functions”成員函數列表窗口中增加了該消息的響應函數,如OnOk。

⑤ 單擊<Edit Code>按鈕,進入消息響應函數定義的編輯窗口,以便為該函數添加代碼。

主站蜘蛛池模板: 伽师县| 都匀市| 阿城市| 卢氏县| 滨海县| 女性| 九龙坡区| 武乡县| 卫辉市| 巫溪县| 西贡区| 溧水县| 揭阳市| 鲁甸县| 阿拉尔市| 克山县| 光山县| 惠州市| 元阳县| 湖南省| 旬邑县| 榆中县| 新竹县| 行唐县| 昌黎县| 墨竹工卡县| 临海市| 唐山市| 治县。| 哈巴河县| 平安县| 阳新县| 乳源| 德格县| 玉溪市| 芜湖县| 开江县| 扎鲁特旗| 舟曲县| 公主岭市| 荆门市|