第4章對話框和常用控件_第1頁
第4章對話框和常用控件_第2頁
第4章對話框和常用控件_第3頁
第4章對話框和常用控件_第4頁
第4章對話框和常用控件_第5頁
已閱讀5頁,還剩114頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 第第4章章 對話框和常用控件對話框和常用控件(Dialog and Common Controls)主講教師:劉懷廣主講教師:劉懷廣 窗口風格窗口風格WS_CHILD、WS_OVERLAPED、WS_POPUP窗口風格窗口風格一般過程是一般過程是:添加對話框資源;:添加對話框資源; 設置對話框的屬性;設置對話框的屬性; 添加和布局控件;添加和布局控件; 創建對話框類;創建對話框類; 添加對話框代碼;添加對話框代碼; 在程序中調用對話框在程序中調用對話框4.1 對話框的使用對話框的使用4.1.1 資源與資源標識資源與資源標識1. 資源的分類資源的分類 創建單文檔應用程序創建單文檔應用程序Ex_

2、SDI,然后項目工作區窗口切換到,然后項目工作區窗口切換到“ResourceView”頁面。頁面。資源類別資源類別資源標識符資源標識符4.1.1 資源與資源標識資源與資源標識 快捷鍵列表快捷鍵列表(Accelerator):一系列組合鍵用來引發一個動:一系列組合鍵用來引發一個動作。與菜單命令相關聯,代替鼠標操作。作。與菜單命令相關聯,代替鼠標操作。 對話框對話框(Dialog):含有按鈕、列表框、編輯框等各種控件:含有按鈕、列表框、編輯框等各種控件的窗口。的窗口。 圖標圖標(Icon):顯示在桌面的位圖:顯示在桌面的位圖,有有32x32/16x16像素兩種像素兩種規格規格 菜單菜單(Menu)

3、:可以完成應用程序的大部分操作。:可以完成應用程序的大部分操作。 字串表字串表(String Table):全局字符串或其他標識符。:全局字符串或其他標識符。 工具欄按鈕工具欄按鈕(Toolbar):通常與菜單命令相對應,提高工:通常與菜單命令相對應,提高工作效率。作效率。 版本信息版本信息(Version):應用程序的版本、用戶注冊碼等相:應用程序的版本、用戶注冊碼等相關信息。關信息。除了上述常用資源類別外,也可以自己添加新的資源類別。除了上述常用資源類別外,也可以自己添加新的資源類別。4.1.1 資源與資源標識資源與資源標識2. ID標識符標識符-遵循下列規則遵循下列規則 在標識符名稱中允

4、許使用在標識符名稱中允許使用字母字母az、AZ、09以及以及下劃線下劃線。 標識符名稱標識符名稱不區分不區分大小寫字母,如大小寫字母,如new_idd與與New_Idd是相是相同的標識符。同的標識符。 不能以數字開頭,如不能以數字開頭,如8BIT是不合法的標識符名。是不合法的標識符名。除了上述規則外,除了上述規則外,Visual C+還提供了一些常用的定義標識還提供了一些常用的定義標識符名稱的前綴供用戶使用、參考。符名稱的前綴供用戶使用、參考。4.1.1 資源與資源標識資源與資源標識4.1.2 添加對話框資源添加對話框資源(1) 選擇選擇“插入插入”“資源資源”菜單,或按快捷鍵菜單,或按快捷鍵

5、Ctrl+R。如圖。如圖所示。所示。新建新建 創建一個由創建一個由“資源類型資源類型”列表中指定類型的新資源列表中指定類型的新資源;定制定制 創建創建“資源類型資源類型”列表中沒有的新類型的資源列表中沒有的新類型的資源;導入導入 是用于將外部已有的位圖、圖標、光標或其他定制的資源是用于將外部已有的位圖、圖標、光標或其他定制的資源添加到當前應用程序中。添加到當前應用程序中。4.1.2 添加對話框資源添加對話框資源表表4.2 對話框資源類型對話框資源類型4.1.2 添加對話框資源添加對話框資源(2) 選中選中“Dialog”,單擊,單擊新建新建按鈕,系統就會自動為當前應用按鈕,系統就會自動為當前應

6、用程序添加了一個對話框資源,并出現如圖所示的界面。程序添加了一個對話框資源,并出現如圖所示的界面。對話框模板對話框模板控件工具欄控件工具欄布局工具欄布局工具欄默認標識符默認標識符4.1.3 設置對話框屬性設置對話框屬性 在對話框模板處右擊鼠標,從彈出的快捷菜單中選擇在對話框模板處右擊鼠標,從彈出的快捷菜單中選擇“屬性屬性” ,出現如圖所示的對話框屬性窗口。出現如圖所示的對話框屬性窗口。 對話框的屬性有對話框的屬性有General(一般一般)、Styles (風格風格)、More Styles(更更多風格多風格)、Extended Styles(擴展風格擴展風格)、More Extended S

7、tyles(更更多擴展風格多擴展風格)等部分,這里僅介紹最常用的等部分,這里僅介紹最常用的General屬性。屬性。表表4.3 對話框的對話框的General屬性屬性4.1.3 設置對話框屬性設置對話框屬性 將添加的對話框的屬性進行將添加的對話框的屬性進行以下以下3點修改,結果如圖點修改,結果如圖: 對話框對話框標識符標識符改成改成IDD_DIALOG_FIRST; 對話框對話框標題標題改為改為“我的第一我的第一個對話框個對話框”; 單擊單擊字體字體按鈕,通過彈出的按鈕,通過彈出的字體對話框將對話框內的文字體對話框將對話框內的文本設置成本設置成“宋體,宋體,9” 。4.1.3 設置對話框屬性設

8、置對話框屬性4.1.4 添加和布局控件添加和布局控件1. 控件的添加控件的添加 利用此工具欄中的各個按鈕可以順利完成控件的添加。利用此工具欄中的各個按鈕可以順利完成控件的添加。控件的選擇控件的選擇靜態文本靜態文本組框組框復選框復選框組合框組合框水平滾動條水平滾動條旋轉按鈕旋轉按鈕滑動條滑動條列表視圖列表視圖標簽標簽復合編輯復合編輯月歷月歷用戶定制控件用戶定制控件靜態圖片靜態圖片編輯框編輯框按鈕按鈕單選框單選框列表框列表框垂直滾動條垂直滾動條進展條進展條熱鍵熱鍵樹形視圖樹形視圖動畫動畫日期選擇日期選擇IP地址地址擴展組合框擴展組合框4.1.4 添加和布局控件添加和布局控件2. 控件的選取控件的選

9、取單個控件單個控件: 用鼠標直接選取用鼠標直接選取 用用Tab鍵選取鍵選取:系統會根據控件的添加次序自動設置相應的:系統會根據控件的添加次序自動設置相應的Tab鍵次序。鍵次序。多個控件:多個控件: 按住鼠標左鍵不放,拖出一個大的虛框,則被該虛框所包圍按住鼠標左鍵不放,拖出一個大的虛框,則被該虛框所包圍的控件都將被選取。的控件都將被選取。 先按住先按住Shift鍵不放,然后用鼠標選取控件。鍵不放,然后用鼠標選取控件。(a)(b)4.1.4 添加和布局控件添加和布局控件圖圖4.8 控件布局工具欄控件布局工具欄3. 控件的刪除、復制和布局控件的刪除、復制和布局 對話框編輯器中提供了控件布局工具欄,它

10、可以自動地排對話框編輯器中提供了控件布局工具欄,它可以自動地排列對話框內的控件,并能改變控件的大小。列對話框內的控件,并能改變控件的大小。表表4.4 “編排編排”菜單命令的快捷鍵及功能描述菜單命令的快捷鍵及功能描述4.1.5 創建對話框類創建對話框類 在對話框資源模板的空白區域在對話框資源模板的空白區域(沒有其他元素或控件沒有其他元素或控件)內內雙雙擊鼠標擊鼠標,將彈出,將彈出“添加新類添加新類”對話框。對話框。 單擊單擊OK按鈕。在按鈕。在“New Class”對話框的對話框的Name框中輸框中輸入類名入類名CFirstDlg。Base class和和Dialog ID內容是由系統內容是由系

11、統自動設置的,一般無需修改。自動設置的,一般無需修改。 從從Base class框的內容可以看出,用戶對話框類是從基類框的內容可以看出,用戶對話框類是從基類CDialog派生而來的。派生而來的。 單擊單擊OK按鈕,一個基于對話框資源模板的對話框類按鈕,一個基于對話框資源模板的對話框類CFirstDlg就創建好了。就創建好了。 4.1.6 添加對話框代碼添加對話框代碼在在MFC ClassWizard對話框,在對話框,在IDs列表中選擇列表中選擇CFirstDlg。1)初始化:)初始化:在在Messages框中找到并選定框中找到并選定WM_INITDIALOG消消息,如圖示。息,如圖示。4.1.

12、6 添加對話框代碼添加對話框代碼BOOL CFirstDlg:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here CStatic* pWnd =(CStatic*)GetDlgItem(IDC_STATIC_1); pWnd-SetWindowText(這是我的第一個對話框!這是我的第一個對話框!); return TRUE;/ return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages sh

13、ould return FALSE2)選擇)選擇OnInitDialog函數函數,單擊,單擊Edit Code按鈕按鈕(或直接在函或直接在函數名雙擊鼠標數名雙擊鼠標),將自動出現該函數代碼編輯窗口,將自動出現該函數代碼編輯窗口,添加代碼添加代碼:CStatic是靜態文本控件的是靜態文本控件的MFC類,類,SetWindowText是是CWnd的的一個成員函數,用來設置窗口的文本內容。一個成員函數,用來設置窗口的文本內容。GetDlgItem也是也是CWnd類的一個成員函數,用來獲得對話框中控件類的一個成員函數,用來獲得對話框中控件(參數是控件參數是控件的的ID標識符,這里是標識符,這里是IDC

14、_STATIC_1)的窗口指針。的窗口指針。4.1.7 在程序中調用對話框在程序中調用對話框(1) 在菜單的空位置上雙擊鼠標左鍵,則出現它的屬性對話框,在在菜單的空位置上雙擊鼠標左鍵,則出現它的屬性對話框,在標題框中輸入標題框中輸入“測試測試(&T)”,結果如圖所示,其中符號,結果如圖所示,其中符號&用來其后用來其后面的字符作為該菜單項的助記符,這樣當按住面的字符作為該菜單項的助記符,這樣當按住“Alt”鍵鍵不放,再敲不放,再敲擊該助記符鍵時,對應的菜單項就會被選中,或在菜單打開時,擊該助記符鍵時,對應的菜單項就會被選中,或在菜單打開時,直接按相應的助記符鍵,對應的菜單項也會被

15、選中。直接按相應的助記符鍵,對應的菜單項也會被選中。4.1.7 在程序中調用對話框在程序中調用對話框(2) 單擊菜單屬性對話框中的單擊菜單屬性對話框中的“保存可見保存可見”(Keep Visible)按鈕。單擊按鈕。單擊“測試測試”菜單項下方的空位置,在屬性對話框中,輸入標題菜單項下方的空位置,在屬性對話框中,輸入標題“對話框對話框(&D)”,在,在ID框輸入該菜單項的資源標識:框輸入該菜單項的資源標識:ID_TEST_DLG,如圖所,如圖所示。示。(3) 單擊單擊“測試測試”菜單項并按住鼠標左鍵不放,移動鼠標,將菜單項并按住鼠標左鍵不放,移動鼠標,將“測試測試”菜單項移到菜單項移到“

16、查看查看”和和“幫助幫助”菜單項之間,然后釋放鼠標。菜單項之間,然后釋放鼠標。4.1.7 在程序中調用對話框在程序中調用對話框(4) 彈出彈出MFC ClassWizard對話框。類選擇對話框。類選擇“CMainFrame”,IDs選擇選擇“ID_TEST_DLG”,在,在Messages框中選擇框中選擇COMMAND消息。消息。(5) 單擊單擊Add Function按鈕,出現按鈕,出現Add Member Function對對 話框,輸入成員函數的名稱:話框,輸入成員函數的名稱:OnTestDlg,如圖所示。當應用,如圖所示。當應用程序運行時,程序運行時,用戶選擇用戶選擇“測試測試”“對話

17、框對話框”,則該函數則該函數OnTestDlg被調用,執行函數中的代碼。被調用,執行函數中的代碼。4.1.7 在程序中調用對話框在程序中調用對話框 代碼中,代碼中,DoModal是是CDialog基類成員函數,用來將對話基類成員函數,用來將對話框按框按模式方式模式方式來顯示。來顯示。(6) 單擊單擊OK ,ClassWizard的的Member functions列表中將列表中將列出新增加的成員函數。列出新增加的成員函數。void CMainFrame:OnTestDlg( ) CFirstDlg dlg;/ 定義對話框類對象定義對話框類對象 dlg.DoModal(); / 顯示對話框顯示對

18、話框4.1.7 在程序中調用對話框在程序中調用對話框(8) 編譯運行。在應用程序菜單上,選擇編譯運行。在應用程序菜單上,選擇“測試測試”“對話框對話框”菜單項,將出現如圖對話框。菜單項,將出現如圖對話框。(7) 在在OnTestDlg函數的實現文件函數的實現文件MainFrm.cpp的前面添加的前面添加CFirstDlg類的包含語句,即:類的包含語句,即:#include Ex_SDI.h#include MainFrm.h#include FirstDlg.h4.1.8 使用無模式對話框使用無模式對話框模式對話框:模式對話框:對話框被彈出,戶必須對話框作出相應的操作,對話框被彈出,戶必須對話

19、框作出相應的操作,在退出對話框之前,其它操作不能繼續執行在退出對話框之前,其它操作不能繼續執行。無模式對話框:無模式對話框:是指當對話框被彈出后,是指當對話框被彈出后,一直保留在屏幕上一直保留在屏幕上,用用戶可以繼續進行其它操作戶可以繼續進行其它操作。4.1.8 使用無模式對話框使用無模式對話框創建并使用無模式對話框,其步驟如下:創建并使用無模式對話框,其步驟如下:添加一個對話框,將其標識符設為添加一個對話框,將其標識符設為IDD_DIALOG_SECOND。為為IDD_DIALOG_SECOND對話框資源創建一個對話框類對話框資源創建一個對話框類CSecondDlg。 MFC ClassWi

20、zard,從,從“Class name”列表中選擇列表中選擇CSecondDlg,在,在IDs列表中選擇列表中選擇IDOK,它是對話框中,它是對話框中OK按按鈕的標識符,然后在鈕的標識符,然后在Messages框中選擇框中選擇BN_CLICKED(單擊按單擊按鈕鈕)消息,單擊消息,單擊Add Function按鈕,輸入成員函數的名稱,保按鈕,輸入成員函數的名稱,保留系統默認的函數名為留系統默認的函數名為OnOK。該函數是對。該函數是對OK按鈕單擊消息按鈕單擊消息的映射,即當用戶單擊此對話框中的的映射,即當用戶單擊此對話框中的OK按鈕時,按鈕時,OnOK函數函數被執行。被執行。 修改修改CSec

21、ondDlg:OnOK函數中的代碼。函數中的代碼。4.1.8 使用無模式對話框使用無模式對話框void CSecondDlg:OnOK( ) DestroyWindow(); / 終止對話框顯示終止對話框顯示 delete this; / 刪除對話框,釋放內存空間刪除對話框,釋放內存空間 代碼中,代碼中,DestroyWindow是對話框基類是對話框基類CWnd的一個的一個成員函數,用來終止窗口。成員函數,用來終止窗口。4.1.8 使用無模式對話框使用無模式對話框將項目工作區切換到將項目工作區切換到ClassView頁面,展開頁面,展開CMainFrame類的類的所有成員,雙擊所有成員,雙擊O

22、nTestDlg自動定位到該函數的實現代碼處,自動定位到該函數的實現代碼處,修改代碼如下:修改代碼如下:void CMainFrame:OnTestDlg( ) CSecondDlg *pDlg=new CSecondDlg;/ 動態分配內存空間動態分配內存空間 pDlg-Create(IDD_DIALOG_SECOND); / 創建對話框創建對話框 pDlg-ShowWindow(SW_NORMAL); / 顯示對話框顯示對話框 在文件在文件MainFrm.cpp的前面添加包含語句的前面添加包含語句,編譯運行。編譯運行。#include SecondDlg.h4.1.8 對話框的使用對話框的

23、使用1.DoModal() 重載函數,重載DoModal()成員函數2.PreSubclassWindow() 重載函數,允許首先子分類一個窗口3.OnCreate() 消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建4.OnSize() 消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化5.OnMove() 消息響應函數,響應WM_MOVE消息,以告訴窗口正在移動6.OnSetFont() 消息響應函數,響應WM_SETFONT消息,以允許改變對話框中控件的字體7.OnInitDialog() 消息響應函數,響應WM_INITDIALOG消息允

24、許初始化對話框中的控件,或創建新控件8.OnShowWindow() 消息響應函數,響應WM_SHOWWINDOW消息,被ShowWindow()函數調用9.OnCtlColor() 消息響應函數,響應WM_CTLCOLOR消息,被父窗口發送已改變對話框或對話框上面控件的顏色10. OnChildNotify() 重載函數,作為WM_CTLCOLOR消息的結果發送1.OnClose() 消息響應函數,響應WM_CLOSE消息,當關閉按鈕被單擊的時候,該函數被調用2.OnKillFocus() 消息響應函數,響應WM_KILLFOCUS消息,當一個窗口即將失去鍵盤輸入焦點以前被發送3.OnDes

25、troy() 消息響應函數,響應WM_DESTROY消息,當一個窗口即將被銷毀時,被發送4.OnNcDestroy() 消息響應函數,響應WM_NCDESTROY消息,當一個窗口被銷毀以后被發送5.PostNcDestroy() 重載函數,作為處理OnNcDestroy()函數的最后動作被CWnd調用4.1.8 對話框的使用對話框的使用1.PreSubclassWindow() 重載函數,允許用戶首先子分類一個窗口2.OnCreate() 消息響應函數,響應WM_CREATE消息,以告訴一個窗口已經被創建3.OnSize() 消息響應函數,響應WM_SIZE消息,以告訴窗口大小發生變化4.On

26、Move() 消息響應函數,響應WM_MOVE消息,以告訴窗口正在移動5.OnSetFont() 消息響應函數,響應WM_SETFONT消息,以允許改變對話框中控件的字體1.OnClose() 消息響應函數,響應窗口的WM_CLOSE消息,當關閉按鈕被單擊的時候發送此消息2.OnDestroy() 消息響應函數,響應窗口的WM_DESTROY消息,當一個窗口將被銷毀時,發送此消息3.OnNcDestroy() 消息響應函數,響應窗口的WM_NCDESTROY消息,當一個窗口被銷毀后發送此消息4.PostNcDestroy() 重載函數,作為處理OnNcDestroy()函數的最后動作,被CWn

27、d調用4.2 控件的創建和使用方法控件的創建和使用方法 為了更好地發揮控件作用,必須理解和掌握控件的屬性、為了更好地發揮控件作用,必須理解和掌握控件的屬性、消息以及創建和使用的方法。消息以及創建和使用的方法。4.2.1 控件的創建方法控件的創建方法 一種是一種是將控件的父窗口指定為對話框將控件的父窗口指定為對話框,這樣做的好處是,這樣做的好處是明顯的,因為當應用程序啟動該對話框時,明顯的,因為當應用程序啟動該對話框時,Windows系統就系統就會為對話框創建控件;而當對話框消失時,控件也隨之清除。會為對話框創建控件;而當對話框消失時,控件也隨之清除。 另一種是另一種是將控件看作是任一窗口的子窗

28、口將控件看作是任一窗口的子窗口,并通過調用,并通過調用相應的相應的Create函數來創建。函數來創建。4.2.1 控件的創建方法控件的創建方法例例Ex_DlgCtrls 使用控件的編程方式來創建一個按鈕使用控件的編程方式來創建一個按鈕 選擇選擇“文件文件”“新建新建”菜單,在彈出的菜單,在彈出的新建對話框新建對話框的項的項目類型列表中選擇目類型列表中選擇MFC AppWizard(exe)類型,在工程框類型,在工程框中輸入項目名中輸入項目名Ex_DlgCtrls。1. 單擊單擊確定確定按鈕,在出現的按鈕,在出現的“Step 1”對話框中選擇對話框中選擇“基本基本對話對話”應用程序類型,單擊應用

29、程序類型,單擊完成完成按鈕。按鈕。 將項目工作區切換到將項目工作區切換到ClassView頁面,展開頁面,展開CEx_DlgCtrlsDlg類,右擊類,右擊CEx_DlgCtrlsDlg類名,彈出如圖所示快捷菜單。類名,彈出如圖所示快捷菜單。4.2.1 控件的創建方法控件的創建方法 從快捷菜單中選擇從快捷菜單中選擇Add Member Variable,定義一個,定義一個CButton類對象類對象m_btnWnd,通常以,通常以“m_”來作為變量的來作為變量的開頭,表示開頭,表示“成員成員”(member)的意思。單擊的意思。單擊OK。4.2.1 控件的創建方法控件的創建方法 在項目工作區窗口

30、的在項目工作區窗口的ClassView頁面中,雙擊頁面中,雙擊OnInitDialog函函數名。數名。BOOL CEx_DlgCtrlsDlg:OnInitDialog() CDialog:OnInitDialog(); m_btnWnd.Create(你好你好, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 20, 120, 60), this, 201); / 創建創建 CFont *font = this-GetFont();/ 獲取對話框的字體獲取對話框的字體 m_btnWnd.SetFont(font);/ 設置控件字體設置控件字體

31、 return TRUE; / return TRUE unless you set the focus to a control Create用來創建一個按鈕控件,該函數用來創建一個按鈕控件,該函數第一個參數第一個參數:指定該按鈕的標題,指定該按鈕的標題,第二個參數第二個參數:指定控件的風格,:指定控件的風格,第三第三個參數個參數:指定它在父窗口中的位置和大小,:指定它在父窗口中的位置和大小,第四個參數第四個參數:指定父窗口指針,指定父窗口指針,最后一個參數最后一個參數:該控件的標識值。:該控件的標識值。4.2.2 控件的消息及消息映射控件的消息及消息映射typedef struct tag

32、MSG / msg HWND hwnd; / 接收到消息的窗口句柄接收到消息的窗口句柄 UINT message;/ 消息消息 WPARAM wParam;/ 消息的附加信息,它的含義取消息的附加信息,它的含義取決于決于message LPARAM lParam; / 消息的附加信息,它的含義消息的附加信息,它的含義取決于取決于message DWORD time; / 消息傳送時的時間消息傳送時的時間 POINT pt; / 消息傳送時,光標所在的屏幕坐標消息傳送時,光標所在的屏幕坐標 MSG; 當控件的狀態發生改變時,控件就會向其父窗口發送消息,這當控件的狀態發生改變時,控件就會向其父窗口

33、發送消息,這個消息稱為個消息稱為“通知消息通知消息”。對于每個消息,系統都會用一個。對于每個消息,系統都會用一個MSG結結構來記錄,構來記錄,MSG具有下列結構:具有下列結構:4.2.2 控件的消息及消息映射控件的消息及消息映射 通知消息通常是一條通知消息通常是一條WM_COMMAND消息,這條消息的消息,這條消息的wParam參數的低位字中含有控件標識符,參數的低位字中含有控件標識符,wParam參數的高參數的高位字則為通知代碼,位字則為通知代碼,lParam參數則是指向控件的句柄。參數則是指向控件的句柄。 而對于有些控件,其通知消息通常是一條而對于有些控件,其通知消息通常是一條WM_NOT

34、IFY消息,這條消息的消息,這條消息的wParam參數是發送通知消息的控件的標識參數是發送通知消息的控件的標識符,而符,而lParam參數則是指向一個結構指針。參數則是指向一個結構指針。4.2.2 控件的消息及消息映射控件的消息及消息映射1. 映射控件消息映射控件消息 將項目工作區窗口切換到將項目工作區窗口切換到ResourseView頁面,雙擊頁面,雙擊Dialog資源下的標識資源下的標識DD_EX_DLGCTRLS_DIALOG,打開該,打開該對話框資源模板。對話框資源模板。1)添加一個按鈕控件,保留其默認屬性。如圖所示。)添加一個按鈕控件,保留其默認屬性。如圖所示。2) 打開打開MFC

35、ClassWizard,選擇,選擇CEx_DlgCtrlsDlg,在,在IDs中中選 擇選 擇 I D C _ B U T TO N 1 , 然 后 在, 然 后 在 M e s s a g e s 框 中 選 擇框 中 選 擇BN_CLICKED消息。消息。4.2.2 控件的消息及消息映射控件的消息及消息映射3) 單擊單擊Add Function或雙擊或雙擊BN_CLICKED,出現,出現“Add Member Function”對話框,在這里可以輸入成員函數的名稱。對話框,在這里可以輸入成員函數的名稱。4) 單擊單擊OK,新增加的成員函數。單擊,新增加的成員函數。單擊Edit Code按鈕

36、按鈕(或直或直接在函數名雙擊鼠標接在函數名雙擊鼠標)。void CEx_DlgCtrlsDlg:OnButton1() MessageBox(你按下了你按下了Button1按鈕!按鈕!);4.2.2 控件的消息及消息映射控件的消息及消息映射2. 映射控件映射控件通用通用消息消息 (自學自學) 也可通過也可通過WM_COMMAND消息的映射來處理一個或多個消息的映射來處理一個或多個控件的通用消息:控件的通用消息:1)打開)打開MFC ClassWizard,在,在IDs列表中選擇列表中選擇CEx_DlgCtrlsDlg,在,在Messages框中找到并雙擊框中找到并雙擊OnCommand,這樣,

37、這樣OnCommand消息函數就添加好了。消息函數就添加好了。2) 在在OnCommand函數中添加下列代碼:函數中添加下列代碼: 4.2.2 控件的消息及消息映射控件的消息及消息映射BOOL CEx_DlgCtrlsDlg:OnCommand(WPARAM wParam, LPARAM lParam) WORD nCode = HIWORD(wParam); / 控件的通知消息控件的通知消息 WORD nID = LOWORD(wParam);/ 控件的控件的ID值值 if (nID = 201)&(nCode = BN_CLICKED) MessageBox(你按下了你按下了你好你

38、好按鈕!按鈕!); if (nID = IDC_BUTTON1)&(nCode = BN_CLICKED) MessageBox(這是在這是在OnCommand處理的結果!處理的結果!); return CDialog:OnCommand(wParam, lParam);注意:第一條注意:第一條if語句中,語句中,201是前面用是前面用Create創建按鈕時指創建按鈕時指定的標識值。定的標識值。4.2.3 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV) MFC ClassWizard可以很容易地為一個控件定義關聯可以很容易地為一個控件定義關聯變量并可設置其數據范圍

39、。例如,下面的步驟是為變量并可設置其數據范圍。例如,下面的步驟是為CEx_DlgCtrlsDlg類的按鈕控件類的按鈕控件IDC_BUTTON1添加并使添加并使用其關聯變量用其關聯變量m_RelBtn。 MFC ClassWizardMember Variables頁面。頁面。(2) 選定選定Class name CEx_DlgCtrlsDlg 在在Control IDs列列表中表中 IDC_BUTTON1 雙擊鼠標左鍵雙擊鼠標左鍵 Add Member Variable對話框,在對話框設置變量的名稱、類別和數據類對話框,在對話框設置變量的名稱、類別和數據類型,如圖所示。型,如圖所示。4.2.3

40、 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV)4.2.3 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV)/ Dialog Data/AFX_DATA(CEx_DlgCtrlsDlg)enum IDD = IDD_EX_DLGCTRLS_DIALOG ;/ 枚舉類型CButtonm_RelBtn;CStringm_strEdit;/AFX_DATA(3) 在對話框中任意添加一個編輯框控件,取默認的在對話框中任意添加一個編輯框控件,取默認的ID,為其關,為其關聯一個聯一個CString類的成員變量類的成員變量m_strEdit,下方數據校驗窗口中,下方

41、數據校驗窗口中設置變量允許的最大字符個數。設置變量允許的最大字符個數。(4) 單擊單擊確定確定 打開打開CEx_DlgCtrlsDlg源文件,源文件,三方面的修改三方面的修改。Ex_DlgCtrlsDlg.h中,添加控件關聯變量的聲明,代碼如下面中,添加控件關聯變量的聲明,代碼如下面的加粗部分:的加粗部分:Ex_DlgCtrlsDlg.cpp中的中的CEx_DlgCtrlsDlg處,添加了控件處,添加了控件變量的一些初始代碼:變量的一些初始代碼:CEx_DlgCtrlsDlg:CEx_DlgCtrlsDlg(CWnd* pParent /*=NULL*/): CDialog(CEx_DlgCt

42、rlsDlg:IDD, pParent)/AFX_DATA_INIT(CEx_DlgCtrlsDlg) m_strEdit = _T();/AFX_DATA_INIT4.2.3 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV)在在Ex_DlgCtrlsDlg.cpp文件中的文件中的DoDataExchange函數體內,函數體內,添加了控件的添加了控件的DDX/DDVvoid CEx_DlgCtrlsDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /調用此函數作為DDX開始 /AFX_DA

43、TA_MAP(CEx_DlgCtrlsDlg) DDX_Control(pDX, IDC_BUTTON1, m_RelBtn); DDX_Text(pDX, IDC_EDIT1, m_strEdit); /將IDC_EDIT1與m_strEdit進行數據交換 DDV_MaxChars(pDX, m_strEdit, 20); /校驗m_strEdit的最大字符個數不超過20 /AFX_DATA_MAP4.2.3 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV)void CEx_DlgCtrlsDlg:OnButton1() UpdateData();/ 默認參數值是默認參數

44、值是TRUEm_RelBtn.SetWindowText(m_strEdit);(5) 可以使用可以使用CWnd:UpdateData函數實現控件數據的輸入函數實現控件數據的輸入和讀取。和讀取。 代碼中,代碼中,UpdateData函數只有一個為函數只有一個為TRUE或或FALSE的的參數。參數。4.2.3 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV)(6) 運行該程序,當在編輯框中輸入運行該程序,當在編輯框中輸入“Hello”后,單擊后,單擊Button1按鈕,按鈕,OnButton1函數中的函數中的UpdateData將編輯框將編輯框內容保存到內容保存到m_strE

45、dit變量中,從而執行下一條語句后按鈕變量中,從而執行下一條語句后按鈕的名稱就變成了編輯框控件中的內容的名稱就變成了編輯框控件中的內容“Hello”,如圖所示。,如圖所示。圖圖4.33 使用控件的數據成員變量使用控件的數據成員變量4.2.3 控件的數據交換控件的數據交換(DDX)和數據校驗和數據校驗(DDV)4.3 常用控件常用控件分為三類:分為三類:Windows公共控件公共控件ActiveX控件控件MFC新增的一些控件新增的一些控件4.3 常用控件常用控件4.3.1 靜態控件和按鈕靜態控件和按鈕1. 靜態控件靜態控件 一個靜態控件是用來顯示一個字符串、框、矩形、圖標、一個靜態控件是用來顯示

46、一個字符串、框、矩形、圖標、位圖或增強的圖元文件。它可以被用來作為標簽、框或位圖或增強的圖元文件。它可以被用來作為標簽、框或用來分隔其它的控件。一個靜態控件一般不接收用戶輸用來分隔其它的控件。一個靜態控件一般不接收用戶輸入,也不產生通知消息。入,也不產生通知消息。 屬于靜態控件的有:屬于靜態控件的有:靜態文本靜態文本( )、組框組框( )和和靜靜態圖片態圖片( )三種。其中,靜態圖片控件的一般屬性對三種。其中,靜態圖片控件的一般屬性對話框如圖話框如圖4.34所示。所示。 4.3.1 靜態控件和按鈕靜態控件和按鈕General屬性對話框屬性對話框表表4.6 靜態圖片控件的靜態圖片控件的Gener

47、al和和Style屬性屬性4.3.1 靜態控件和按鈕靜態控件和按鈕2. 按鈕按鈕常見的常見的3種類型:種類型:按鍵按鈕、單選按鈕、復選框按鈕按鍵按鈕、單選按鈕、復選框按鈕。單選按鈕單選按鈕:分為:分為一般和自動一般和自動兩種類型。在自動類型中,若選中兩種類型。在自動類型中,若選中同同組組中的某個單選按鈕,則其余的單選按鈕的選中狀態就會清除。中的某個單選按鈕,則其余的單選按鈕的選中狀態就會清除。按鍵按鈕按鍵按鈕:按鍵按鈕有兩種風格:按鍵按鈕有兩種風格:標準按鍵按鈕和默認按鍵標準按鍵按鈕和默認按鍵按鈕。按鈕。復選框復選框:選中時,復選框中就加上一個:選中時,復選框中就加上一個“”標記,通常復選框標

48、記,通常復選框只有選中和未選中兩種狀態。設定成三態復選框的方法是在復選只有選中和未選中兩種狀態。設定成三態復選框的方法是在復選框屬性對話框的框屬性對話框的Style頁面中選中頁面中選中“(狀態狀態)Tri-state”項。項。 4.3.1 靜態控件和按鈕靜態控件和按鈕3. 按鈕的消息按鈕的消息常見的只有兩個:常見的只有兩個:BN_CLICKED (單擊按鈕單擊按鈕)BN_DOUBLE- CLICKED (雙擊按鈕雙擊按鈕)4.3.1 靜態控件和按鈕靜態控件和按鈕void SetCheck( int nCheck );int GetCheck( ) const; nCheck和和GetCheck

49、返回值:返回值:0不選中,不選中,1選中,選中,2不確定不確定(僅用于三態按鈕僅用于三態按鈕)4. 按鈕選中操作按鈕選中操作 CButton類的類的SetCheck和和GetCheck分別用來設置或分別用來設置或獲取指定按鈕的選中狀態。獲取指定按鈕的選中狀態。4.3.1 靜態控件和按鈕靜態控件和按鈕5. 示例:制作問卷調查示例:制作問卷調查4.3.1 靜態控件和按鈕靜態控件和按鈕例例Ex_Research 制作問卷調查制作問卷調查1)創建并設計對話框創建并設計對話框 創建一個默認的對話框應用程序創建一個默認的對話框應用程序Ex_Research。 Visual C+會自動打開對話框編輯器并顯示

50、對話框資源模板。會自動打開對話框編輯器并顯示對話框資源模板。 調整對話框的大小。調整對話框的大小。右擊添加的組框控件。右擊添加的組框控件。ID為默認的為默認的IDC_STATIC。Caption屬屬性內容由性內容由“Static”改成改成“你的年齡你的年齡”。組框控件的。組框控件的Styles屬屬性:性:“水平對齊水平對齊”屬性用來指定文本在頂部的左邊屬性用來指定文本在頂部的左邊(Left)、居、居中中(Center)還是右邊還是右邊(Right)。默認。默認(Default)選項表示左對齊。選項表示左對齊。4.3.1 靜態控件和按鈕靜態控件和按鈕 在組框內添加在組框內添加4個個單選按鈕單選按

51、鈕,默認的,默認的ID依次為依次為IDC_RADIO1、IDC_RADIO2、IDC_RADIO3和和IDC_RADIO4。 添加一個添加一個靜態文本靜態文本,標題設為,標題設為“你使用的接入方式:你使用的接入方式:”,然,然后在其下再添加后在其下再添加4個單選按鈕,標題分別是個單選按鈕,標題分別是“FTTL或或ADSL”、“單位單位LAN”、“撥號撥號56K”和和“其他其他”。 添加一個添加一個組框控件組框控件,其標題為,其標題為“你上網主要是你上網主要是”。然后添加。然后添加四個復選框,其標題分別為四個復選框,其標題分別為“收發郵件收發郵件”、“瀏覽資料瀏覽資料”、“聊天游戲聊天游戲”和和

52、“其他。其他。4.3.1 靜態控件和按鈕靜態控件和按鈕 對話框測試后,可以發現:順序添加的這對話框測試后,可以發現:順序添加的這8個單選按鈕全部個單選按鈕全部變成一組,在這組中只有一個單選按鈕被選中,這不符合我變成一組,在這組中只有一個單選按鈕被選中,這不符合我們的本意。解決這個問題的最好的辦法是將每一組中的第一們的本意。解決這個問題的最好的辦法是將每一組中的第一個單選按鈕的個單選按鈕的Group(組組)屬性屬性選中。選中。 分別將這二個問題中的第一個單選按鈕的分別將這二個問題中的第一個單選按鈕的Group(組組)屬性均屬性均選中。選中。 單擊對話框編輯器工具欄上的單擊對話框編輯器工具欄上的切

53、換輔助線按鈕切換輔助線按鈕,然后將對話,然后將對話框中的控件調整到輔助線以內,并適當對其他控件進行調整。框中的控件調整到輔助線以內,并適當對其他控件進行調整。這樣,整個問卷調查的對話框就設計好了,單擊工具欄上的這樣,整個問卷調查的對話框就設計好了,單擊工具欄上的測試對話框按鈕測試對話框按鈕 進行測試。進行測試。2) 完善代碼完善代碼(1) 將項目工作區切換到將項目工作區切換到ClassView(類視圖類視圖)頁面,展開頁面,展開CEx_ResearchDlg類所有成員,雙擊類所有成員,雙擊OnInitDialog函數名函數名BOOL CEx_ResearchDlg:OnInitDialog()

54、 CDialog:OnInitDialog(); CheckRadioButton(IDC_AGE_L18, IDC_AGE_M38, IDC_AGE_18T27); CheckRadioButton(IDC_CM_FTTL, IDC_CM_OTHER, IDC_CM_FTTL); CButton* pBtn = (CButton*)GetDlgItem(IDC_DO_POP); pBtn-SetCheck(1);/ 使使“收發郵件收發郵件”復選框選中復選框選中 return TRUE; / return TRUE unless you set the focus to a control G

55、etDlgItem是是CWnd類的一個成員函數,用來獲得對話框中類的一個成員函數,用來獲得對話框中控件的窗口指針。控件的窗口指針。4.3.1 靜態控件和按鈕靜態控件和按鈕(2) 用用MFC ClassWizard在在CEx_ResearchDlg類中添加類中添加IDOK按鈕的按鈕的BN_CLICKED消息映射,并添加下列代碼。消息映射,并添加下列代碼。void CEx_ResearchDlg:OnOK() CString str, strCtrl;/ 定義兩個字符串變量,定義兩個字符串變量,CString是操是操作字符串的作字符串的MFC類類 / 獲取第一個問題的用戶選擇獲取第一個問題的用戶選

56、擇str = 你的年齡:你的年齡:;UINT nID = GetCheckedRadioButton( IDC_AGE_L18, IDC_AGE_M38);GetDlgItemText(nID, strCtrl);/ 獲取指定控件的標題文本獲取指定控件的標題文本str = str + strCtrl; / 獲取第二個問題的用戶選擇獲取第二個問題的用戶選擇str = str + n你使用的接入方式:你使用的接入方式:;nID = GetCheckedRadioButton( IDC_CM_FTTL, IDC_CM_OTHER);GetDlgItemText(nID, strCtrl);/ 獲取指

57、定控件的標題文本獲取指定控件的標題文本str = str + strCtrl; / 獲取第三個問題的用戶選擇獲取第三個問題的用戶選擇str = str + n你上網主要是:你上網主要是:n;UINT nCheckIDs4=IDC_DO_POP, IDC_DO_READ, IDC_DO_GAME, IDC_DO_OTHER;CButton* pBtn;for (int i=0; iGetCheck() ) pBtn-GetWindowText( strCtrl ); str = str + strCtrl; str = str + ;MessageBox( str );CDialog:OnOK(

58、); GetDlgItemText是是CWnd類成員函數,第一個參數用來指類成員函數,第一個參數用來指定控件的標定控件的標識識,第二個參數是返回的,第二個參數是返回的窗口文本窗口文本。后面的函數。后面的函數GetWindowText的作用與的作用與GetDlgItemText相同,也是獲取窗口的文本內容。不過,相同,也是獲取窗口的文本內容。不過,GetWindowText使用更加廣泛。使用更加廣泛。4.3.2 編輯框和旋轉按鈕控件編輯框和旋轉按鈕控件1. 編輯框編輯框 編輯框是一個讓用戶從鍵盤輸入和編輯文本的矩形窗口,很方編輯框是一個讓用戶從鍵盤輸入和編輯文本的矩形窗口,很方便地輸入各種文本、

59、數字或者口令,也可使用它來編輯和修改簡單便地輸入各種文本、數字或者口令,也可使用它來編輯和修改簡單的文本內容。的文本內容。(1) 編輯框的屬性和通知消息編輯框的屬性和通知消息:如圖:如圖4.44所示。表所示。表4.7還列出其中各還列出其中各項的含義。向其父窗口發送一些消息,如表項的含義。向其父窗口發送一些消息,如表4.8所示。所示。表表4.7 編輯框的編輯框的Style屬性屬性表表4.8 編輯框的通知消息編輯框的通知消息4.3.2 編輯框和旋轉按鈕控件編輯框和旋轉按鈕控件1. 編輯框編輯框(2) 編輯框的基本操作編輯框的基本操作1) 口令設置口令設置:用戶輸入的每個字符都被一個特殊的字符代替顯

60、:用戶輸入的每個字符都被一個特殊的字符代替顯示。默認的口令字符是示。默認的口令字符是“*”,用成員函數,用成員函數CEdit:SetPasswordChar 來定義自己的口令字符:來定義自己的口令字符: void SetPasswordChar( TCHAR ch );/當當ch = 0時,編輯時,編輯框內顯示實際字符。框內顯示實際字符。2) 選擇文本選擇文本:作為整體進行各種編輯操作。用:作為整體進行各種編輯操作。用鼠標鼠標的方法:在的方法:在要選擇的文本的一端按下鼠標左鍵并拖動鼠標,到另一端釋要選擇的文本的一端按下鼠標左鍵并拖動鼠標,到另一端釋放鼠標鍵。用放鼠標鍵。用鍵盤鍵盤的方法:在按光標方向移動鍵的同時,按的方法:在按光

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論