界面編程3對話框_第1頁
界面編程3對話框_第2頁
界面編程3對話框_第3頁
界面編程3對話框_第4頁
界面編程3對話框_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、2.3 對話框與控件對話框(dialog box)是GUI的常用組件,也是其最復雜的組件,主要用于接收用戶的各種輸入和選擇,也可用于向用戶顯示信息。在對話框中可以包含文本框、編輯框、列表框、組合框、按鈕、單選鈕、復選框等各種控件(control),供用戶查看、輸入和選擇,也可響應用戶操作命令來完成一定的任務(wù)。1對話框1)分類(1) 模式對話框與無模式對話框按工作方式不同,可將對話框分成兩類:l 模式對話框(modal dialog box模態(tài)對話框):在關(guān)閉模式對話框之前,該程序不能進行其他工作(如“打開文件”對話框)l 無模式對話框(modeless dialog box非模態(tài)對話框):模式

2、對話框打開后,該程序仍然能夠進行其他工作(如“查找與替換”對話框)(2) 公用對話框與用戶對話框按編程方式不同,還可將Windows對話框分成兩類:l 公用對話框(common dialog boxes通用/公共對話框):Windows提供的一組標準用戶接口對話框,包括文件、顏色、字體、查找替換、頁面設(shè)置、打印等對話框。公用對話框的資源與處理代碼被封裝在動態(tài)連接庫文件comdlg32.dll中,該文件一般放在Windows系統(tǒng)安裝目錄下的system32子目錄中,可供所有的Win32應用程序調(diào)用。l 用戶對話框(user dialog box):用戶自己創(chuàng)建的對話框,對話框的資源與處理代碼都由

3、程序員自己來編寫。用戶對話框,還可以進一步分成如下兩種具體類型:n 輸入型:主要用于接受用戶的輸入和選擇,需要自己創(chuàng)建對話框類和添加控件變量,并利用MFC的對話框自動數(shù)據(jù)交換(DDX)功能。這是最常見的一種用戶對話框類型,用于一般的應用程序。n 操作型:主要用于響應用戶的操作,不需要添加控件變量,一般也不能利用DDX功能,需要自己進行對話框數(shù)據(jù)的初始化設(shè)置和當前值與狀態(tài)的獲取。操作型對話框,一般用于基于對話框的應用程序。2)類層次結(jié)構(gòu)MFC的對話框基類為CDialog,它既支持模式對話框(調(diào)用其成員函數(shù)DoModal),也支持無模式對話框(調(diào)用其成員函數(shù)Create + ShowWindow)

4、。用戶自定義對話框類,一般都是直接從CDialog類派生的。MFC的公用對話框類CCommonDialog是從CDialog派生的,而它又是其他各種具體公用對話框類的基類。Windows提供的各種公用對話框被MFC封裝在對應名稱的類中,常用的具體公用對話框類有:文件對話框類(CFileDialog)、顏色對話框類(CColorDialog)、字體對話框類(CFontDialog)、查找替換對話框類(CFindReplaceDialog)、頁面設(shè)置對話框類(CPageSetupDialog)、打印對話框類(CPrintDialog)等,可參見下面的類層次結(jié)構(gòu)圖。對話框類的層次結(jié)構(gòu)圖3)創(chuàng)建和使用

5、用戶對話框的步驟創(chuàng)建和使用自定義用戶模式對話框的主要步驟為:l 創(chuàng)建對話框資源:使用對話框編輯器創(chuàng)建對話框資源(如添加各種控件,調(diào)整控件的大小與位置,設(shè)置控件的ID與內(nèi)容)l 對輸入型對話框:n 創(chuàng)建對話框類:使用“MFC類向?qū)А睂υ捒騽?chuàng)建CDialog的派生類,并將它與已經(jīng)創(chuàng)建對話框資源ID相關(guān)聯(lián)n 添加類的控件變量:使用“添加成員變量向?qū)А睂υ捒蛳蚺缮膶υ捒蝾愔刑砑映蓡T變量n 添加事件處理:使用“事件處理程序向?qū)А睘閷υ捒蛑械模ò粹o和編輯框等可生成事件的)控件添加事件處理函數(shù),編寫處理代碼n 使用對話框:在應用程序的某個類中的需要處(一般是在視圖類的某個事件處理或消息響應函數(shù)中)u 創(chuàng)建

6、對話框?qū)ο髐 初始化對話框的控件變量u 用成員函數(shù)DoModal打開對話框u 在用戶按“確定”(IDOK)鍵關(guān)閉對話框后,通過對話框類的控件變量獲取用戶的輸入和選擇l 對操作型對話框:n 初始化:在用戶對話框類的重寫型消息響應函數(shù)OnInitDialog中,對對話框中的控件做初始化設(shè)置,主要是設(shè)置應用程序的各種輸入和選擇參數(shù)的初值n 添加事件處理:使用“事件處理程序向?qū)А睘閷υ捒蛑械模ò粹o和編輯框等可生成事件的)控件添加事件處理函數(shù),編寫處理代碼(包括獲取各控件的當前值或狀態(tài))n (接受用戶輸入:在用戶對話框類的OnOK虛擬成員函數(shù)(該函數(shù)在用戶按對話框中的“確定”鈕IDOK退出對話框時調(diào)用)

7、中,編寫接受各種輸入和選擇參數(shù)的代碼)4)輸入型用戶對話框例下面以Student程序的輸入對話框為例,介紹一個簡單輸入型用戶對話的創(chuàng)建與使用的典型過程(省卻了添加事件處理步驟)。對Student程序,可在用戶按添加菜單項/按鈕時,彈出對話框,讓用戶輸入學生的姓名和成績。具體操作如下:(1) 創(chuàng)建對話框資源計劃用對話框編輯器建立一個如下圖所示的輸入對話框資源:輸入對話框l 創(chuàng)建對話框資源:在項目工作區(qū)的“資源視圖”頁中的“Dialog”項上單擊鼠標右鍵,在彈出菜單中選“插入Dialog”項,VS會自動創(chuàng)建一個ID為“IDD_DIALOG1”、標題為“Dialog”、含“確定”(IDOK)與“取消

8、”(IDCANCEL)按鈕的缺省對話框,并打開對話框編輯器包括位于VS窗口中部的對話框資源編輯窗口、位于VS窗口右部的工具箱窗口、位于VS窗口頂部的格式工具條和增加的“格式”菜單(參見下圖)對話框編輯器l 打開屬性窗口和工具箱窗口:n 工具箱窗口,在鼠標離開后,會自動關(guān)閉,最好釘住它(此時,屬性窗口會出現(xiàn)在其下面)n 如果看不到屬性窗口,可以(讓鼠標離開來)關(guān)閉工具箱窗口、或選“視圖其它窗口屬性窗口”菜單項;n 如果看不到工具箱窗口,可以將鼠標放在VS窗口右端的上,或選“視圖工具箱”菜單項l 修改對話框的ID和標題:選中項目工作區(qū)的“資源視圖”頁中的“StudentStudent.rc Dia

9、logIDD_DIALOG1”,在對應屬性窗口中“雜項”組的ID欄將對話框的標識符修改為“IDD_INPUT”,在“外觀”組的標題欄“Caption”將對話框的標題修改為“輸入學生信息”l 在工具箱中選中靜態(tài)文本工具“Aa Static Text”,在對話框客戶區(qū)中的適當位置n 單擊鼠標左鍵,直接輸入“姓名(&N):”,則會自動修改其“Caption”欄中內(nèi)容,并自動調(diào)整文本框的大小n 或畫一個矩形,在屬性窗口“外觀”組中“Caption”欄中,將內(nèi)容改為“姓名(&N):”,手工調(diào)整文本框的大小(也可以選中靜態(tài)文本框,按鼠標右鍵彈出浮動菜單,選則其中的“按內(nèi)容調(diào)整大小”菜單項來

10、自動進行大小調(diào)整)其中的“&N”為訪問鍵,作用與菜單項中的類似:在運行時,可利用Alt+N來快速定位。但是要注意創(chuàng)建控件的順序,因為編輯控件沒有Caption屬性,所以要定位某一編輯控件,是靠邏輯上位于它前面的靜態(tài)文本控件中訪問鍵來決定的(因為靜態(tài)文本控件本身不能有輸入焦點,所以用其訪問鍵并不能定位到它自己,而是定位到邏輯上位于它后面的可具有輸入焦點的控件,如編輯控件、列表控件等)。所謂控件的邏輯順序是指在創(chuàng)建對話框資源的過程中控件被創(chuàng)建的先后順序。如果控件的邏輯順序不對,可以以文本方式打開“*.rc”文件,在對應的對話框代碼段中,手工調(diào)整對應控件行的順序。l 在工具箱中選中編輯控件工

11、具“ab| Edit Control”,在姓名文本框的右邊單擊或畫一個矩形,在屬性窗口“雜項”組中的ID欄中,修改ID為“IDC_NAME”l 在工具箱中選中分組框工具“ Group Box”,在姓名下面畫一個較大的矩形(這時可能需要先下拉對話框的下邊框來加大對話框),在屬性窗口“雜項”組中“Caption”欄中,將內(nèi)容改為“成績(&S):”l 類似于姓名靜態(tài)文本框和編輯控件框,可在成績分組框內(nèi)添加“數(shù)學(&M):”、“英語(&E):”和“計算機(&P):”的文本框和編輯控件(ID分別設(shè)為IDC_MATH、IDC_ENG和IDC_COMP)l 可用鼠標或方向鍵調(diào)

12、整對話框的大小和每個控件的位置(和大?。?,也可以利用對話框工具條中各種對齊按鈕來調(diào)整。例如,先同時選中“確定”與“取消”兩個鈕,單擊格式工具條中的垂直對齊按鈕,將它們在對話框的右邊對中(參見下圖)選擇控件的方法:n 選工具箱中的“ 指針”工具n 選中單個控件:單擊n 選中多個控件:u 按住Ctrl鍵不放,用鼠標逐個選中u 或用鼠標圈定l 最后得到本小節(jié)開始時所示的對話框資源l 還可以單擊格式工具條中的垂直對測試對話框按鈕來對編輯好的用戶自定義對話框進行測試(參見下圖)對話框測試對應的對話框資源文本(也位于Student.rc文件中)為:IDD_INPUT DIALOGEX 0, 0, 148,

13、 121STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "輸入學生信息"FONT 8, "MS Shell Dlg", 400, 0, 0x1BEGIN DEFPUSHBUTTON "確定",IDOK,129,25,50,14 PUSHBUTTON "取消",IDCANCEL,129,55,50,14 LTEXT "姓名(&N):",IDC_STATIC,

14、7,7,35,8 EDITTEXT IDC_NAME,44,7,51,14,ES_AUTOHSCROLL LTEXT "訪問鍵(&K):",IDC_STATIC,9,30,42,8 EDITTEXT IDC_MNEM,53,27,18,14,ES_AUTOHSCROLL GROUPBOX "成績(&S):",IDC_STATIC,7,22,116,64 LTEXT "數(shù)學(&M):",IDC_STATIC,17,38,36,8 EDITTEXT IDC_MATH,55,35,40,14,ES_AUTOHSCRO

15、LL LTEXT "英語(&E):",IDC_STATIC,19,53,34,8 EDITTEXT IDC_ENG,55,52,40,14,ES_AUTOHSCROLL LTEXT "計算機(&P):",IDC_STATIC,11,70,42,8 EDITTEXT IDC_COMP,55,69,40,14,ES_AUTOHSCROLLEND(2) 創(chuàng)建對話框類l 添加類:n 打開“MFC類向?qū)А睂υ捒颍▍⒁娤聢D):u 選中(編輯好了的)對話框資源,按鼠標右鍵彈出浮動菜單,單擊其中的“添加類”菜單項,就會打開“MFC類向?qū)А睂υ捒騯 或在項

16、目區(qū)的類視圖頁中的項目名(本例中為Student)上,按鼠標右鍵彈出浮動菜單,單擊其中的“添加類”菜單項,也會打開“MFC類向?qū)А睂υ捒騇FC類向?qū)υ捒騨 在對話框的“類名”欄中,鍵入用戶對話框類的名稱“CInputDlg”,其余部分采用缺省的(“基類”為CDialog、“對話框ID”為“IDD_INPUT”、“自動化”欄選“無”單選鈕、頭文件和代碼文件分別為InputDlg.h和InputDlg.cpp),按“完成”鈕,則VS會自動創(chuàng)建與該對話框資源相關(guān)聯(lián)的一個名為CInputDlg對話框類l 添加類變量:n 打開“添加成員變量向?qū)А睂υ捒颍▍⒁娤聢D):u 選中對話框的某個編輯控件框(例如

17、姓名編輯控件),按鼠標右鍵,在彈出的浮動菜單中單擊“添加變量”菜單項,會打開“添加成員變量向?qū)А睂υ捒騯 或在項目區(qū)的類視圖頁,選中CInputDlg項,按鼠標右鍵,在彈出的浮動菜單中單擊“添加添加變量”菜單項,也會打開“添加成員變量向?qū)А睂υ捒蛱砑映蓡T變量向?qū)υ捒騨 選擇控件ID:選中對話框中部頂?shù)摹翱丶兞俊睆瓦x框,在“控件ID”欄的下拉式列表中,選中某個ID(例如ID_NAME)n 選擇類別:在該對話框的右上部的“類別”欄的下拉式列表中,選中“value”(缺省為“control”)n 選擇變量類型:對value類別的缺省“變量類型”為字符串類型“CString”,可以從“變量類型”下

18、拉式列表中選擇其他類型,如int、float等等n 鍵入變量名:在“變量名”欄中輸入與編輯控件對應的變量名(例如m_sName)n 設(shè)置變量大小和范圍:u 對字符串型的類變量(例如m_sName),可在“最大字符數(shù)”欄中設(shè)置最大字符數(shù)(例如4)u 對數(shù)值型的類變量(例如m_iMath),可在“最小值”和“最大值”欄中分別設(shè)置變量的最小值和最大值(例如0和100)n 完成:按“完成”鈕,結(jié)束變量添加過程(必需一個一個地添加,非常麻煩)n 下面是Student項目的輸入對話框中的類變量設(shè)置表:控件ID變量名類型大小范圍姓名IDC_NAMEm_sNameCString4訪問鍵IDC_MNEMm_sM

19、nemCString1數(shù)學IDC_MATHm_iMathint0100英語IDC_ENGm_iEngint0100計算機IDC_COMPm_iCompint0100下面是MFC自動產(chǎn)生的部分代碼。l 在構(gòu)造函數(shù)的頭部自動初始化各個類變量(如果選中過“自動化”單選鈕,則還在構(gòu)造函數(shù)中調(diào)用CCmdTarget類的成員函數(shù)EnableAutomation來設(shè)置對話框的自動化處理):CInputDlg:CInputDlg(CWnd* pParent /*=NULL*/): CDialog(CInputDlg:IDD, pParent), m_sName(_T(""), m_sMne

20、m(_T(""), m_iMath(0), m_iEng(0), m_iComp(0)/EnableAutomation();l 在DoDataExchange函數(shù)中,設(shè)置各個類變量和對應控件之間的映射,并設(shè)置變量的取值范圍:void CInputDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX, IDC_NAME, m_sName);DDV_MaxChars(pDX, m_sName, 4);DDX_Text(pDX, IDC_MNEM, m_sMnem);DDV_

21、MaxChars(pDX, m_sMnem, 1);DDX_Text(pDX, IDC_MATH, m_iMath);DDV_MinMaxInt(pDX, m_iMath, 0, 100);DDX_Text(pDX, IDC_ENG, m_iEng);DDV_MinMaxInt(pDX, m_iEng, 0, 100);DDX_Text(pDX, IDC_COMP, m_iComp);DDV_MinMaxInt(pDX, m_iComp, 0, 100);(3) 使用對話框l 在視圖類的代碼文件(如StudentView.cpp)中包含對話框的頭文件(如InputDlg.h),位置應該位于語句

22、“#include "stdafx.h"”之后l 在視圖類的某個菜單項(如“學生/輸入”ID_INPUT)事件處理函數(shù)中,創(chuàng)建對話框?qū)ο?,初始化參?shù),顯示模式對話框(參見下圖)l 若DoModal函數(shù)返回的是IDOK,則保存用戶輸入和選擇的參數(shù),并進行其他需要的操作??梢詤⒁娤旅娴拇a段:(其中,m_sName和m_sMnem為視圖類的CString類變量,初值可為L"陳六"和L"C"等;m_iMath、m_iEng 和m_iComp為視圖類的int變量,取值如75、90和80等。)void CStudentView:OnInput(

23、)/ TODO: 在此添加命令處理程序代碼if(m_iAddNum >= 2) return; CInputDlg dlg;dlg.m_sName = m_sName;dlg. m_sMnem = m_sMnem;dlg.m_iMath = m_iMath;dlg.m_iEng = m_iEng;dlg.m_iComp = m_iComp;if(dlg.DoModal() = IDOK) m_sName = dlg.m_sName;m_sMnem = dlg. m_sMnem;m_iMath = dlg.m_iMath;m_iEng = dlg.m_iEng;m_iComp = dlg.

24、m_iComp;5)無模式對話框?qū)υ捒虻馁Y源是中性的,即可作為模式對話框來使用,也可作為無模式對話框來使用。關(guān)鍵是看使用的方法。在使用模式對話框時,是用DoModal成員函數(shù)來顯示模式對話框。而對無模式對話框則必須先調(diào)用CDialog類的Create等成員函數(shù)來創(chuàng)建對話框?qū)ο?,然后再利用從CWnd類繼承的ShowWindow成員函數(shù)來顯示無模式對話框。(1) 創(chuàng)建和刪除對話框窗口為此,可以先定義一個視圖類的對話框?qū)ο箢愖兞?,如:CDialog m_mlDlg;并在視圖類的構(gòu)造函數(shù)中,調(diào)用CDialog類的成員函數(shù):virtual BOOL Create(UINT nIDTemplate, CW

25、nd* pParentWnd = NULL);來創(chuàng)建對話框?qū)ο螅渲衝IDTemplate為對話框資源的ID。例如:m_mlDlg.Create(IDD_INPUTDLG);與Create對應,可在視圖類的析構(gòu)函數(shù)中,調(diào)用CWnd的成員函數(shù):virtual BOOL DestroyWindow( );來刪除Create所創(chuàng)建的對話框窗口對象,如:m_mlDlg.DestroyWindow();(2) 顯示對話框可以添加一個菜單項(如ID_ML_DLG)及其事件處理函數(shù)(如OnMlDlg),并在該函數(shù)中用SW_SHOW參數(shù)調(diào)用CWnd的成員函數(shù):BOOL ShowWindow(int nCmdS

26、how);來顯示無模式對話框。例如:void CStudentView:OnMlDlg() m_mlDlg.ShowWindow(SW_SHOW);(3) 設(shè)置成最頂層窗口不過,這時的無模式對話框,在你選中應用程序主框架窗口后,會被窗口所覆蓋。解決辦法是在創(chuàng)建對話框?qū)ο笾螅僖?amp;wndTopMost為首個參數(shù)來調(diào)用CWnd的成員函數(shù):BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags);將無模式對話框設(shè)置成最頂層窗口。例如:CStudentView:CStud

27、entView() m_mlDlg.Create(IDD_INPUTDLG);RECT rcDlg; m_mlDlg.GetWindowRect(&rcDlg); m_mlDlg.SetWindowPos(&wndTopMost, rcDlg.left, rcDlg.top, 0, 0, SWP_NOSIZE); / cx = cy =0表示忽略大小參數(shù)(保持不變)6)公用對話框的使用公用對話框是Windows為應用程序提供的一組標準用戶接口對話框,負責從用戶那里收集常見的幾類信息,但并不對這些信息進行任何處理。MFC中的公用對話框類常用的有:l CFileDialog:文件對

28、話框類l CColorDialog:顏色對話框類l CFontDialog:字體對話框類l CFindReplaceDialog:查找替換對話框類l CPageSetupDialog:頁面設(shè)置對話框類l CPrintDialog:打印對話框類一般可以直接使用公用對話框類來創(chuàng)建對象,而不必另外派生類。每個公用對話框的工作方式各有不同,下面我們以文件和顏色對話框為例來說明公用對話框的使用。為此,在Student項目的主菜單中,添加一個“公用對話框(&O)”菜單;并在其中添加兩個菜單項:“打開圖像文件(&F)tShift+F”(ID_DLG_FILE)和“設(shè)置顏色(&C)tS

29、hift+C”(ID_DLG_COLOR);還要添加對應的快捷鍵和命令消息響應函數(shù)。(1) 文件對話框文件對話框類CFileDialog的構(gòu)造函數(shù)為:explicit CFileDialog(BOOL bOpenFileDialog, / TRUE:打開文件; FALSE:保存文件LPCTSTR lpszDefExt = NULL, / 缺省擴展名LPCTSTR lpszFileName = NULL, / 初始文件名DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, / 標志LPCTSTR lpszFilter = NULL, /

30、文件過濾器串的指針CWnd* pParentWnd = NULL / 父窗口指針 DWORD dwSize = 0 / OPENFILENAME結(jié)構(gòu)的大小,=0:由MFC根據(jù)操作系統(tǒng)的版本確定);常用的成員函數(shù)有:l 打開模式對話框(返回IDOK或IDCANCEL):virtual INT_PTR DoModal( );l 獲取文件的路徑(如“C:Imageslena.bmp”):CString GetPathName( ) const;l 獲取文件的名稱(如“l(fā)ena.bmp”):CString GetFileName( ) const;l 獲取文件的擴展名(如“bmp”):CString GetFileExt( ) const;l 獲取文件的標題(如“l(fā)ena”):CString GetFileTitle( ) const;l

溫馨提示

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

評論

0/150

提交評論