




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2.3 對話框與控件對話框(dialog box)是GUI的常用組件,也是其最復雜的組件,主要用于接收用戶的各種輸入和選擇,也可用于向用戶顯示信息。在對話框中可以包含文本框、編輯框、列表框、組合框、按鈕、單選鈕、復選框等各種控件(control),供用戶查看、輸入和選擇,也可響應用戶操作命令來完成一定的任務。1對話框1)分類(1) 模式對話框與無模式對話框按工作方式不同,可將對話框分成兩類:l 模式對話框(modal dialog box模態對話框):在關閉模式對話框之前,該程序不能進行其他工作(如“打開文件”對話框)l 無模式對話框(modeless dialog box非模態對話框):模式
2、對話框打開后,該程序仍然能夠進行其他工作(如“查找與替換”對話框)(2) 公用對話框與用戶對話框按編程方式不同,還可將Windows對話框分成兩類:l 公用對話框(common dialog boxes通用/公共對話框):Windows提供的一組標準用戶接口對話框,包括文件、顏色、字體、查找替換、頁面設置、打印等對話框。公用對話框的資源與處理代碼被封裝在動態連接庫文件comdlg32.dll中,該文件一般放在Windows系統安裝目錄下的system32子目錄中,可供所有的Win32應用程序調用。l 用戶對話框(user dialog box):用戶自己創建的對話框,對話框的資源與處理代碼都由
3、程序員自己來編寫。用戶對話框,還可以進一步分成如下兩種具體類型:n 輸入型:主要用于接受用戶的輸入和選擇,需要自己創建對話框類和添加控件變量,并利用MFC的對話框自動數據交換(DDX)功能。這是最常見的一種用戶對話框類型,用于一般的應用程序。n 操作型:主要用于響應用戶的操作,不需要添加控件變量,一般也不能利用DDX功能,需要自己進行對話框數據的初始化設置和當前值與狀態的獲取。操作型對話框,一般用于基于對話框的應用程序。2)類層次結構MFC的對話框基類為CDialog,它既支持模式對話框(調用其成員函數DoModal),也支持無模式對話框(調用其成員函數Create + ShowWindow)
4、。用戶自定義對話框類,一般都是直接從CDialog類派生的。MFC的公用對話框類CCommonDialog是從CDialog派生的,而它又是其他各種具體公用對話框類的基類。Windows提供的各種公用對話框被MFC封裝在對應名稱的類中,常用的具體公用對話框類有:文件對話框類(CFileDialog)、顏色對話框類(CColorDialog)、字體對話框類(CFontDialog)、查找替換對話框類(CFindReplaceDialog)、頁面設置對話框類(CPageSetupDialog)、打印對話框類(CPrintDialog)等,可參見下面的類層次結構圖。對話框類的層次結構圖3)創建和使用
5、用戶對話框的步驟創建和使用自定義用戶模式對話框的主要步驟為:l 創建對話框資源:使用對話框編輯器創建對話框資源(如添加各種控件,調整控件的大小與位置,設置控件的ID與內容)l 對輸入型對話框:n 創建對話框類:使用“MFC類向導”對話框創建CDialog的派生類,并將它與已經創建對話框資源ID相關聯n 添加類的控件變量:使用“添加成員變量向導”對話框向派生的對話框類中添加成員變量n 添加事件處理:使用“事件處理程序向導”為對話框中的(按鈕和編輯框等可生成事件的)控件添加事件處理函數,編寫處理代碼n 使用對話框:在應用程序的某個類中的需要處(一般是在視圖類的某個事件處理或消息響應函數中)u 創建
6、對話框對象u 初始化對話框的控件變量u 用成員函數DoModal打開對話框u 在用戶按“確定”(IDOK)鍵關閉對話框后,通過對話框類的控件變量獲取用戶的輸入和選擇l 對操作型對話框:n 初始化:在用戶對話框類的重寫型消息響應函數OnInitDialog中,對對話框中的控件做初始化設置,主要是設置應用程序的各種輸入和選擇參數的初值n 添加事件處理:使用“事件處理程序向導”為對話框中的(按鈕和編輯框等可生成事件的)控件添加事件處理函數,編寫處理代碼(包括獲取各控件的當前值或狀態)n (接受用戶輸入:在用戶對話框類的OnOK虛擬成員函數(該函數在用戶按對話框中的“確定”鈕IDOK退出對話框時調用)
7、中,編寫接受各種輸入和選擇參數的代碼)4)輸入型用戶對話框例下面以Student程序的輸入對話框為例,介紹一個簡單輸入型用戶對話的創建與使用的典型過程(省卻了添加事件處理步驟)。對Student程序,可在用戶按添加菜單項/按鈕時,彈出對話框,讓用戶輸入學生的姓名和成績。具體操作如下:(1) 創建對話框資源計劃用對話框編輯器建立一個如下圖所示的輸入對話框資源:輸入對話框l 創建對話框資源:在項目工作區的“資源視圖”頁中的“Dialog”項上單擊鼠標右鍵,在彈出菜單中選“插入Dialog”項,VS會自動創建一個ID為“IDD_DIALOG1”、標題為“Dialog”、含“確定”(IDOK)與“取消
8、”(IDCANCEL)按鈕的缺省對話框,并打開對話框編輯器包括位于VS窗口中部的對話框資源編輯窗口、位于VS窗口右部的工具箱窗口、位于VS窗口頂部的格式工具條和增加的“格式”菜單(參見下圖)對話框編輯器l 打開屬性窗口和工具箱窗口:n 工具箱窗口,在鼠標離開后,會自動關閉,最好釘住它(此時,屬性窗口會出現在其下面)n 如果看不到屬性窗口,可以(讓鼠標離開來)關閉工具箱窗口、或選“視圖其它窗口屬性窗口”菜單項;n 如果看不到工具箱窗口,可以將鼠標放在VS窗口右端的上,或選“視圖工具箱”菜單項l 修改對話框的ID和標題:選中項目工作區的“資源視圖”頁中的“StudentStudent.rc Dia
9、logIDD_DIALOG1”,在對應屬性窗口中“雜項”組的ID欄將對話框的標識符修改為“IDD_INPUT”,在“外觀”組的標題欄“Caption”將對話框的標題修改為“輸入學生信息”l 在工具箱中選中靜態文本工具“Aa Static Text”,在對話框客戶區中的適當位置n 單擊鼠標左鍵,直接輸入“姓名(&N):”,則會自動修改其“Caption”欄中內容,并自動調整文本框的大小n 或畫一個矩形,在屬性窗口“外觀”組中“Caption”欄中,將內容改為“姓名(&N):”,手工調整文本框的大小(也可以選中靜態文本框,按鼠標右鍵彈出浮動菜單,選則其中的“按內容調整大小”菜單項來
10、自動進行大小調整)其中的“&N”為訪問鍵,作用與菜單項中的類似:在運行時,可利用Alt+N來快速定位。但是要注意創建控件的順序,因為編輯控件沒有Caption屬性,所以要定位某一編輯控件,是靠邏輯上位于它前面的靜態文本控件中訪問鍵來決定的(因為靜態文本控件本身不能有輸入焦點,所以用其訪問鍵并不能定位到它自己,而是定位到邏輯上位于它后面的可具有輸入焦點的控件,如編輯控件、列表控件等)。所謂控件的邏輯順序是指在創建對話框資源的過程中控件被創建的先后順序。如果控件的邏輯順序不對,可以以文本方式打開“*.rc”文件,在對應的對話框代碼段中,手工調整對應控件行的順序。l 在工具箱中選中編輯控件工
11、具“ab| Edit Control”,在姓名文本框的右邊單擊或畫一個矩形,在屬性窗口“雜項”組中的ID欄中,修改ID為“IDC_NAME”l 在工具箱中選中分組框工具“ Group Box”,在姓名下面畫一個較大的矩形(這時可能需要先下拉對話框的下邊框來加大對話框),在屬性窗口“雜項”組中“Caption”欄中,將內容改為“成績(&S):”l 類似于姓名靜態文本框和編輯控件框,可在成績分組框內添加“數學(&M):”、“英語(&E):”和“計算機(&P):”的文本框和編輯控件(ID分別設為IDC_MATH、IDC_ENG和IDC_COMP)l 可用鼠標或方向鍵調
12、整對話框的大小和每個控件的位置(和大小),也可以利用對話框工具條中各種對齊按鈕來調整。例如,先同時選中“確定”與“取消”兩個鈕,單擊格式工具條中的垂直對齊按鈕,將它們在對話框的右邊對中(參見下圖)選擇控件的方法:n 選工具箱中的“ 指針”工具n 選中單個控件:單擊n 選中多個控件:u 按住Ctrl鍵不放,用鼠標逐個選中u 或用鼠標圈定l 最后得到本小節開始時所示的對話框資源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 "數學(&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) 創建對話框類l 添加類:n 打開“MFC類向導”對話框(參見下圖):u 選中(編輯好了的)對話框資源,按鼠標右鍵彈出浮動菜單,單擊其中的“添加類”菜單項,就會打開“MFC類向導”對話框u 或在項
16、目區的類視圖頁中的項目名(本例中為Student)上,按鼠標右鍵彈出浮動菜單,單擊其中的“添加類”菜單項,也會打開“MFC類向導”對話框MFC類向導對話框n 在對話框的“類名”欄中,鍵入用戶對話框類的名稱“CInputDlg”,其余部分采用缺省的(“基類”為CDialog、“對話框ID”為“IDD_INPUT”、“自動化”欄選“無”單選鈕、頭文件和代碼文件分別為InputDlg.h和InputDlg.cpp),按“完成”鈕,則VS會自動創建與該對話框資源相關聯的一個名為CInputDlg對話框類l 添加類變量:n 打開“添加成員變量向導”對話框(參見下圖):u 選中對話框的某個編輯控件框(例如
17、姓名編輯控件),按鼠標右鍵,在彈出的浮動菜單中單擊“添加變量”菜單項,會打開“添加成員變量向導”對話框u 或在項目區的類視圖頁,選中CInputDlg項,按鼠標右鍵,在彈出的浮動菜單中單擊“添加添加變量”菜單項,也會打開“添加成員變量向導”對話框添加成員變量向導對話框n 選擇控件ID:選中對話框中部頂的“控件變量”復選框,在“控件ID”欄的下拉式列表中,選中某個ID(例如ID_NAME)n 選擇類別:在該對話框的右上部的“類別”欄的下拉式列表中,選中“value”(缺省為“control”)n 選擇變量類型:對value類別的缺省“變量類型”為字符串類型“CString”,可以從“變量類型”下
18、拉式列表中選擇其他類型,如int、float等等n 鍵入變量名:在“變量名”欄中輸入與編輯控件對應的變量名(例如m_sName)n 設置變量大小和范圍:u 對字符串型的類變量(例如m_sName),可在“最大字符數”欄中設置最大字符數(例如4)u 對數值型的類變量(例如m_iMath),可在“最小值”和“最大值”欄中分別設置變量的最小值和最大值(例如0和100)n 完成:按“完成”鈕,結束變量添加過程(必需一個一個地添加,非常麻煩)n 下面是Student項目的輸入對話框中的類變量設置表:控件ID變量名類型大小范圍姓名IDC_NAMEm_sNameCString4訪問鍵IDC_MNEMm_sM
19、nemCString1數學IDC_MATHm_iMathint0100英語IDC_ENGm_iEngint0100計算機IDC_COMPm_iCompint0100下面是MFC自動產生的部分代碼。l 在構造函數的頭部自動初始化各個類變量(如果選中過“自動化”單選鈕,則還在構造函數中調用CCmdTarget類的成員函數EnableAutomation來設置對話框的自動化處理):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函數中,設置各個類變量和對應控件之間的映射,并設置變量的取值范圍: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)事件處理函數中,創建對話框對象,初始化參數,顯示模式對話框(參見下圖)l 若DoModal函數返回的是IDOK,則保存用戶輸入和選擇的參數,并進行其他需要的操作。可以參見下面的代碼段:(其中,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)無模式對話框對話框的資源是中性的,即可作為模式對話框來使用,也可作為無模式對話框來使用。關鍵是看使用的方法。在使用模式對話框時,是用DoModal成員函數來顯示模式對話框。而對無模式對話框則必須先調用CDialog類的Create等成員函數來創建對話框對象,然后再利用從CWnd類繼承的ShowWindow成員函數來顯示無模式對話框。(1) 創建和刪除對話框窗口為此,可以先定義一個視圖類的對話框對象類變量,如:CDialog m_mlDlg;并在視圖類的構造函數中,調用CDialog類的成員函數:virtual BOOL Create(UINT nIDTemplate, CW
25、nd* pParentWnd = NULL);來創建對話框對象,其中nIDTemplate為對話框資源的ID。例如:m_mlDlg.Create(IDD_INPUTDLG);與Create對應,可在視圖類的析構函數中,調用CWnd的成員函數:virtual BOOL DestroyWindow( );來刪除Create所創建的對話框窗口對象,如:m_mlDlg.DestroyWindow();(2) 顯示對話框可以添加一個菜單項(如ID_ML_DLG)及其事件處理函數(如OnMlDlg),并在該函數中用SW_SHOW參數調用CWnd的成員函數:BOOL ShowWindow(int nCmdS
26、how);來顯示無模式對話框。例如:void CStudentView:OnMlDlg() m_mlDlg.ShowWindow(SW_SHOW);(3) 設置成最頂層窗口不過,這時的無模式對話框,在你選中應用程序主框架窗口后,會被窗口所覆蓋。解決辦法是在創建對話框對象之后,再以&wndTopMost為首個參數來調用CWnd的成員函數:BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags);將無模式對話框設置成最頂層窗口。例如: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表示忽略大小參數(保持不變)6)公用對話框的使用公用對話框是Windows為應用程序提供的一組標準用戶接口對話框,負責從用戶那里收集常見的幾類信息,但并不對這些信息進行任何處理。MFC中的公用對話框類常用的有:l CFileDialog:文件對
28、話框類l CColorDialog:顏色對話框類l CFontDialog:字體對話框類l CFindReplaceDialog:查找替換對話框類l CPageSetupDialog:頁面設置對話框類l CPrintDialog:打印對話框類一般可以直接使用公用對話框類來創建對象,而不必另外派生類。每個公用對話框的工作方式各有不同,下面我們以文件和顏色對話框為例來說明公用對話框的使用。為此,在Student項目的主菜單中,添加一個“公用對話框(&O)”菜單;并在其中添加兩個菜單項:“打開圖像文件(&F)tShift+F”(ID_DLG_FILE)和“設置顏色(&C)tS
29、hift+C”(ID_DLG_COLOR);還要添加對應的快捷鍵和命令消息響應函數。(1) 文件對話框文件對話框類CFileDialog的構造函數為: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結構的大小,=0:由MFC根據操作系統的版本確定);常用的成員函數有:l 打開模式對話框(返回IDOK或IDCANCEL):virtual INT_PTR DoModal( );l 獲取文件的路徑(如“C:Imageslena.bmp”):CString GetPathName( ) const;l 獲取文件的名稱(如“lena.bmp”):CString GetFileName( ) const;l 獲取文件的擴展名(如“bmp”):CString GetFileExt( ) const;l 獲取文件的標題(如“lena”):CString GetFileTitle( ) const;l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度中國人壽集團春季校園招聘火熱進行中(923個職位)筆試參考題庫附帶答案詳解
- 安全員的工作總結范文(31篇)
- 湖北省鄂東南省級示范高中教育教學改革聯盟學校2024-2025學年高一下學期期中聯考化學試卷 含解析
- DB41∕T 1807-2019 紫花苜蓿生產技術規程
- 燃油的限制船舶高級消防課件
- 汽車空調的四種分類方式汽車空調系統維修課堂課件
- 人力資源管理導論課件
- 橋涵工程定額套用課件
- 17《我們都是少先隊員》第一課時 教學設計-2023-2024學年道德與法治一年級下冊統編版
- 任務二判斷貨物列車技術作業的種類任務介紹乙丙丁甲戊下行
- 圍墻拆除工程施工方案
- 性發育異常疾病課件
- 動態分析與設計實驗報告總結
- 清水河儲能電站施工方案設計
- 從汽車檢測看低空飛行器檢測發展趨勢
- 《短視頻拍攝與制作》課件-3短視頻中期拍攝
- 中鐵投資公司招聘筆試題
- 2024年十堰市中小學教師職稱晉升水平能力測試題附答案
- 中藥熱奄包在急性胃炎治療中的應用研究
- 觀光小火車方案
- 《資本論》思維導圖
評論
0/150
提交評論