對(duì)話框編程C教程課件_第1頁(yè)
對(duì)話框編程C教程課件_第2頁(yè)
對(duì)話框編程C教程課件_第3頁(yè)
對(duì)話框編程C教程課件_第4頁(yè)
對(duì)話框編程C教程課件_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第七章一、用戶對(duì)話框:用戶在使用應(yīng)用程序時(shí),可以對(duì)控件進(jìn)行輸入、輸出操作,而控件是通過(guò)對(duì)話框的數(shù)據(jù)交換機(jī)制與對(duì)話框進(jìn)行數(shù)據(jù)交換的,本節(jié)主要介紹對(duì)話框數(shù)據(jù)交換與驗(yàn)證。1數(shù)據(jù)交換對(duì)話框數(shù)據(jù)交換(DDX,Dialog Data Exchange)用于對(duì)話框及其相關(guān)控件的初始化,并實(shí)現(xiàn)控件與對(duì)話框之間的數(shù)據(jù)交換。DDX機(jī)制的實(shí)現(xiàn)函數(shù)語(yǔ)法如下:void nDlg:DoDataExchange( CDataExchange* pDX )CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(nDlg)DDX_Custom(pDX, nIDC, field);/AFX_DATA_

2、MAP參數(shù)說(shuō)明:nDlg:是進(jìn)行數(shù)據(jù)交換機(jī)制的對(duì)話框類。DDX_Custom:DDX函數(shù),使用的函數(shù)根據(jù)進(jìn)行數(shù)據(jù)交換時(shí)成員變量的數(shù)據(jù)類型和控件決定。pDX:是一個(gè)指向CDataExchange對(duì)象的指針。nIDC:表示進(jìn)行數(shù)據(jù)交換的控件ID。field:表示對(duì)話框類中和控件進(jìn)行關(guān)聯(lián)的成員變量。在對(duì)話框中的數(shù)據(jù)需要進(jìn)行交換時(shí),DoDataExchange函數(shù)就被調(diào)用進(jìn)行數(shù)據(jù)交換。但是還需要調(diào)用函數(shù)UpdateData來(lái)實(shí)現(xiàn)數(shù)據(jù)的更新,UpdateData函數(shù)語(yǔ)法如下:BOOL UpdateData( BOOL bSaveAndValidate = TRUE );參數(shù)說(shuō)明:bSaveAndVali

3、date:該參數(shù)是一個(gè)標(biāo)志,取值如下:l         當(dāng)參數(shù)值為T(mén)RUE時(shí),就用對(duì)話框界面上顯示的值來(lái)設(shè)置對(duì)話框類的成員變量的值。l         當(dāng)參數(shù)值為FALSE時(shí),則按照對(duì)話框類的成員變量的值來(lái)更新對(duì)話框界面上顯示的值。一般情況下,數(shù)據(jù)交換只在對(duì)話框初始化時(shí)才發(fā)生,所以在對(duì)話框類中的其他函數(shù)如果要在設(shè)置成員變量以后,及時(shí)的顯示或者獲取對(duì)話框上最新的輸入值,就必須顯式地調(diào)用UpdateData函數(shù)。 2數(shù)據(jù)驗(yàn)證對(duì)話框數(shù)據(jù)驗(yàn)證

4、(DDV,Dialog Data Validation)用于驗(yàn)證對(duì)話框輸入數(shù)據(jù)的有效性。DDV機(jī)制的實(shí)現(xiàn)函數(shù)語(yǔ)法如下:void nDlg:DoDataExchange( CDataExchange* pDX )CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(nDlg)DDV_Customi(pDX, field, .);/AFX_DATA_MAP參數(shù)說(shuō)明:nDlg:是進(jìn)行數(shù)據(jù)交換機(jī)制的對(duì)話框類。DDV_Custom:DDV函數(shù),使用的函數(shù)根據(jù)進(jìn)行數(shù)據(jù)驗(yàn)證時(shí)成員變量的數(shù)據(jù)類型決定。field:表示對(duì)話框類中和控件進(jìn)行關(guān)聯(lián)的成員變量。.:表示進(jìn)行數(shù)據(jù)驗(yàn)證時(shí)輸入數(shù)

5、據(jù)的有效范圍。下面通過(guò)實(shí)例來(lái)演示一下對(duì)話框是如何進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)驗(yàn)證的。步驟如下:(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)向?qū)υ捒蛑刑砑?個(gè)靜態(tài)文本控件、8個(gè)編輯框控件和一個(gè)按鈕控件。打開(kāi)類向?qū)В瑸榫庉嬁蚩丶砑幼兞?,單擊“Add Variable”按鈕彈出Add Member Variable對(duì)話框,在Add Member Variable對(duì)話框中Category下拉列表中選擇Value,在Variable Type下拉列表中選擇double,添加的變量分別為m_Edit1到m_Edit8,單擊OK按鈕,返回到類向?qū)Т翱?。在類向?qū)Т翱谥袨閙_Edit1到m_Edit7這7個(gè)變量設(shè)置范圍,

6、如圖所示。(3)先看一下通過(guò)類向?qū)砑幼兞恳院笤诔绦蛑凶詣?dòng)生成的代碼。 CDataChangeDlg:CDataChangeDlg(CWnd* pParent /*=NULL*/): CDialog(CDataChangeDlg:IDD, pParent)/AFX_DATA_INIT(CDataChangeDlg)m_Edit1 = 0.0;m_Edit2 = 0.0;m_Edit4 = 0.0;m_Edit3 = 0.0;m_Edit5 = 0.0;m_Edit6 = 0.0;m_Edit7 = 0.0;m_Edit8 = 0.0;/AFX_DATA_INIT/ Note that Load

7、Icon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); void CDataChangeDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CDataChangeDlg)DDX_Text(pDX, IDC_EDIT1, m_Edit1);DDV_MinMaxDouble(pDX, m_Edit1, 0., 100.);DDX

8、_Text(pDX, IDC_EDIT2, m_Edit2);DDV_MinMaxDouble(pDX, m_Edit2, 0., 100.);DDX_Text(pDX, IDC_EDIT4, m_Edit4);DDV_MinMaxDouble(pDX, m_Edit4, 0., 100.);DDX_Text(pDX, IDC_EDIT3, m_Edit3);DDV_MinMaxDouble(pDX, m_Edit3, 0., 100.);DDX_Text(pDX, IDC_EDIT5, m_Edit5);DDV_MinMaxDouble(pDX, m_Edit5, 0., 100.);DDX

9、_Text(pDX, IDC_EDIT6, m_Edit6);DDV_MinMaxDouble(pDX, m_Edit6, 0., 100.);DDX_Text(pDX, IDC_EDIT7, m_Edit7);DDV_MinMaxDouble(pDX, m_Edit7, 0., 100.);DDX_Text(pDX, IDC_EDIT8, m_Edit8);/AFX_DATA_MAP在構(gòu)造函數(shù)CDataChangeDlg中對(duì)添加的變量進(jìn)行初始化,為double型變量賦初值為0.0。在DoDataExchange函數(shù)中實(shí)現(xiàn)了對(duì)話框的數(shù)據(jù)交換與驗(yàn)證。其中DDX_Text函數(shù)將控件與成員變量關(guān)聯(lián)起

10、來(lái),DDV_MinMaxDouble函數(shù)則實(shí)現(xiàn)了對(duì)成員變量值的驗(yàn)證,保證輸入的數(shù)在0到100之間。(4)設(shè)置按鈕的Caption為“計(jì)算總成績(jī)”,處理“計(jì)算總成績(jī)”按鈕的單擊事件,使各科成績(jī)相加得到總成績(jī),代碼如下。void CDataChangeDlg:OnButton1() UpdateData(TRUE);m_Edit8 = m_Edit1 + m_Edit2 + m_Edit3 + m_Edit4 + m_Edit5 + m_Edit6 + m_Edit7;UpdateData(FALSE);使用UpdateData(TRUE);語(yǔ)句獲得編輯框中的各科成績(jī),再通過(guò)UpdateData(

11、FALSE);語(yǔ)句將變量m_Edit8中的數(shù)據(jù)輸出到編輯框中。程序運(yùn)行結(jié)果如圖所示。3消息對(duì)話框消息對(duì)話框是Windows系統(tǒng)中自帶的最簡(jiǎn)單的對(duì)話框,用于提示一些簡(jiǎn)單的信息。在MFC中,消息對(duì)話框通過(guò)CWnd:MessageBox和AfxMessageBox兩個(gè)函數(shù)進(jìn)行調(diào)用。前一個(gè)函數(shù)是CWnd的成員函數(shù),而AfxMessageBox則是全局函數(shù)。MessageBox函數(shù)可以調(diào)用一個(gè)消息對(duì)話框。語(yǔ)法:int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );參數(shù)說(shuō)明:lpszText:消

12、息框中顯示的文本。lpszCaption:消息框的標(biāo)題。nType:消息框中顯示的按鈕風(fēng)格和圖標(biāo)風(fēng)格的組合,可以使用“|”操作符來(lái)組合各種風(fēng)格。默認(rèn)為MB_OK。按鈕風(fēng)格如表7-1所示。 圖標(biāo)風(fēng)格如表所示。 4通用對(duì)話框通用對(duì)話框是由操作系統(tǒng)提供的任何應(yīng)用程序都可獲得的對(duì)話框,使用這些對(duì)話框,可以為用戶提供他們所期望的一致性的標(biāo)準(zhǔn)界面。在Visual C+中,這些對(duì)話框被封裝在CCommonDialog及其派生類中,在開(kāi)發(fā)程序過(guò)程中,常用的通用對(duì)話框控件主要有文件對(duì)話框、查找、替換對(duì)話框、字體對(duì)話框等。1. 文件對(duì)話框CFileDialog類是文件對(duì)話框類,通過(guò)CFileDialog類可以在程

13、序中嵌入文件對(duì)話框,從而實(shí)現(xiàn)標(biāo)準(zhǔn)的“打開(kāi)”和“另存為”對(duì)話框。“打開(kāi)”對(duì)話框如圖7-30所示,“另存為”對(duì)話框如圖7-31所示。 文件對(duì)話框以模態(tài)對(duì)話框形式顯示,用戶可以從對(duì)話框中讀取磁盤(pán)中的文件,也可以在指定目錄下創(chuàng)建新的文件。它提供了多個(gè)方法用于動(dòng)態(tài)獲取或設(shè)置文件名,其主要方法如下:(1)CFileDialog方法:該方法用于構(gòu)造文件對(duì)話框。語(yǔ)法如下:CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADON

14、LY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );參數(shù)說(shuō)明:bOpenFileDialog:確定構(gòu)造“打開(kāi)”對(duì)話框還是構(gòu)造“另存為”對(duì)話框,如果為T(mén)RUE,構(gòu)造“打開(kāi)”對(duì)話框,為FALSE,構(gòu)造“另存為”對(duì)話框。lpszDefExt:用于確定文件默認(rèn)的擴(kuò)展名,如果為NULL,沒(méi)有擴(kuò)展名被插入到文件名中。lpszFileName:確定編輯框中初始化時(shí)的文件名稱,如果為NULL,編輯框中沒(méi)有文件名稱。dwFlags:用于自定義文件對(duì)話框。lpszFilter:用于指定對(duì)話框過(guò)濾的文件類型。P

15、parentWnd:標(biāo)識(shí)文件對(duì)話框的父窗口指針。 (2)DoModal方法:該方法用于顯示文件對(duì)話框,供用戶選擇文件。語(yǔ)法如下:virtual int DoModal( );返回值:如果用戶在對(duì)話框中單擊“OK”按鈕,返回值為IDOK,如果單擊“CANCEL”按鈕,返回值為“IDCANCEL”。(3)GetPathName方法:該方法用于返回用戶選擇文件的完整路徑,包括文件的路徑、文件名和文件擴(kuò)展名。語(yǔ)法如下:CString GetPathName( ) const;(4)GetFileName方法:該方法用于返回用戶選擇的文件名稱,包括文件名和擴(kuò)展名,不包含路徑。語(yǔ)法如下:CString G

16、etFileName( ) const;(5)GetFileExt方法:該方法用于返回文件對(duì)話框中輸入的文件擴(kuò)展名。語(yǔ)法如下:CString GetFileExt( ) const;(6)GetFileTitle方法:該方法用于返回文件對(duì)話框中輸入的文件名稱,不包含路徑和擴(kuò)展名。語(yǔ)法如下:CString GetFileTitle( ) const;(7)GetStartPosition方法:當(dāng)數(shù)據(jù)成員m_ofn的Flags成員包含OFN_ALLOWMULTISELECT標(biāo)記時(shí),允許文件對(duì)話框同時(shí)選擇多個(gè)文件。GetStartPosition方法用于返回文件列表中第一個(gè)文件的位置。語(yǔ)法如下:PO

17、SITION GetStartPosition( ) const;返回值:如果文件列表為空,返回值為NULL;否則返回一個(gè)POSITION值,該值可以用于GetNextPathName方法。(8)GetNextPathName方法:該方法用于在文件列表中指定當(dāng)前位置的下一個(gè)文件全路徑,包括文件的路徑、文件名和文件擴(kuò)展名。語(yǔ)法如下:CString GetNextPathName( POSITION& pos ) const;參數(shù)說(shuō)明:pos:標(biāo)識(shí)文件在列表中的位置,通常來(lái)自于GetStartPosition方法的返回值。如果文件列表中只有一個(gè)文件,則返回該文件全路徑。(9)GetRead

18、OnlyPref方法:該方法用于確定文件對(duì)話框中的“只讀”復(fù)選框是否被選中。語(yǔ)法如下:BOOL GetReadOnlyPref( ) const;返回值:如果返回值為非零,表示“只讀”復(fù)選框被選中,否則復(fù)選框沒(méi)有被選中。(10)OnFileNameOK方法:該方法用于檢查文件名稱是否正確。通常情況下,系統(tǒng)會(huì)進(jìn)行默認(rèn)的檢查。用戶可以改寫(xiě)該方法,進(jìn)行自定義文件名驗(yàn)證。語(yǔ)法如下:virtual BOOL OnFileNameOK( );返回值:返回值為1,表示文件名稱合法;返回值為0,表示文件名不合法。 (11)OnLBSelChangedNotify方法:該方法在文件對(duì)話框中的列表框選項(xiàng)即將改變時(shí)

19、調(diào)用。改寫(xiě)該方法可以進(jìn)行額外的處理工作。語(yǔ)法如下:virtual void OnLBSelChangedNotify( UINT nIDBox, UINT iCurSel, UINT nCode);參數(shù)說(shuō)明:nIDBox:標(biāo)識(shí)列表框ID。iCurSel:標(biāo)識(shí)當(dāng)前選項(xiàng)的索引。nCode:標(biāo)識(shí)控制通知代碼,可選值如下:l         CD_LBSELCHANGE:表示iCurSel標(biāo)識(shí)的項(xiàng)目在一個(gè)單選列表框中被選中。l        

20、CD_LBSELSUB:表示iCurSel標(biāo)識(shí)的項(xiàng)目在一個(gè)多選列表框中不再被選中。l         CD_LBSELADD:表示iCurSel標(biāo)識(shí)的項(xiàng)目在一個(gè)多選列表框中被選中。l         CD_LBSELNOITEMS:表示在多選列表框中沒(méi)有項(xiàng)目被選中。(12)OnInitDone方法:該方法用于處理WM_NOTIFY、CDN_INITDONE消息。用戶可以改寫(xiě)該方法,在WM_NOTIFY、CDN_INITDONE消息發(fā)生時(shí)

21、執(zhí)行特殊的處理。語(yǔ)法如下:virtual void OnInitDone( );(13)OnFileNameChange方法:該方法用于處理WM_NOTIFY、CDN_SELCHANGE消息。當(dāng)用戶在文件列表中選擇一個(gè)新的文件或文件夾時(shí)將發(fā)送WM_NOTIFY、CDN_SELCHANGE消息。用戶可以改寫(xiě)該方法,在事件發(fā)生時(shí)進(jìn)行特殊的處理。語(yǔ)法如下:virtual void OnFileNameChange( );(14)OnFolderChange方法:該方法用于處理WM_NOTIFY、CDN_FOLDERCHANGE消息。當(dāng)用戶在文件對(duì)話框中打開(kāi)一個(gè)文件夾時(shí)將發(fā)送WM_NOTIFY、CDN

22、_FOLDERCHANGE消息,用戶可以改寫(xiě)該方法,在事件發(fā)生時(shí)進(jìn)行特殊的處理。語(yǔ)法如下:virtual void OnFolderChange( );(15)OnTypeChange方法:該方法用于處理WM_NOTIFY、CDN_TYPECHANGE消息。當(dāng)用戶在文件列表中選擇一個(gè)新的文件類型時(shí),觸發(fā)WM_NOTIFY、CDN_TYPECHANGE消息。用戶可以改寫(xiě)該方法,在事件發(fā)生時(shí)進(jìn)行特殊的處理。語(yǔ)法如下:virtual void OnTypeChange( );在開(kāi)發(fā)程序時(shí),當(dāng)用戶需要從磁盤(pán)中選擇一個(gè)文件或者將數(shù)據(jù)保存到磁盤(pán)文件時(shí),需要使用文件對(duì)話框。例如在程序中備份數(shù)據(jù)庫(kù)時(shí),需要用戶

23、指定備份文件。在設(shè)計(jì)程序時(shí),可以使用文件對(duì)話框讓用戶輸入或選擇一個(gè)備份文件。下面的代碼演示了文件對(duì)話框的創(chuàng)建和使用。void COpenFileDlg:OnOK()CFileDialog* filedialog;filedialog = new CFileDialog(true,"bak");/創(chuàng)建“打開(kāi)”對(duì)話框if (filedialog->DoModal()=IDOK )/顯示“打開(kāi)”對(duì)話框CString str;str = filedialog->GetPathName();/讀取用戶選擇的文件delete (filedialog);執(zhí)行效果如圖示。 2.

24、 查找/替換對(duì)話框CFindReplaceDialog類封裝了通用的“查找”和“替換”對(duì)話框。它提供了多個(gè)方法用于獲取查找數(shù)據(jù)時(shí)的選項(xiàng)。例如,查找時(shí)是否區(qū)分大小寫(xiě)、向前查找還是向后查找等。用戶可以在回調(diào)函數(shù)中根據(jù)這些方法確定查找數(shù)據(jù)時(shí)的選項(xiàng),根據(jù)各個(gè)選項(xiàng)實(shí)現(xiàn)其查找或替換功能?!安檎摇?對(duì)話框如左圖所示,“替換”對(duì)話框如右圖所示。 下面以具體實(shí)例來(lái)介紹如何使用查找、替換對(duì)話框。(1)新建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)在窗口中添加CRichEditCtrl控件,設(shè)置控件屬性,如圖所示。 (3)在對(duì)話框類的頭文件中定義CFindReplaceDialog* m_finddlg;在對(duì)話框的消息映射部

25、分添加如下映射宏:ON_REGISTERED_MESSAGE(WM_FINDMESSAGE, OnFindReplace )(4)添加OnFindReplace消息處理函數(shù),代碼如下:long CAaaDlg:OnFindReplace(WPARAM wParam, LPARAM lParam)if (m_finddlg->ReplaceCurrent() /用戶單擊替換按鈕str = m_finddlg->GetReplaceString(); /讀取替換的對(duì)話框findstr = m_finddlg->GetFindString(); /讀取查找的對(duì)話框FINDTEXTE

26、X temp; /設(shè)置查找范圍和查找內(nèi)容temp.lpstrText = findstr.GetBuffer(str.GetLength();m_richedit.SetFocus();temp.chrg.cpMin = 0;temp.chrg.cpMax = -1;int result = m_richedit.FindText(0,&temp); /開(kāi)始查找if (result =-1)return 0;int num = findstr.GetLength();m_richedit.SetSel(temp.chrgText.cpMin,temp.chrgText.cpMax);m

27、_richedit.ReplaceSel(str);/替換選中的文本return 0;(5)處理按鈕的單擊事件,創(chuàng)建并顯示“替換”對(duì)話框,代碼如下:void CAaaDlg:OnOK() m_finddlg = new CFindReplaceDialog();m_finddlg->Create(FALSE,NULL);m_finddlg->ShowWindow(SW_SHOW);3. 字體對(duì)話框(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)在對(duì)話框中放置靜態(tài)文本、編輯框等控件,如圖所示。(3)為編輯框控件設(shè)置相應(yīng)的變量。處理按鈕的單擊事件,代碼如下:void CFontDlgDlg:

28、OnOK() CFont* tempfont = m_edit1.GetFont(); /獲取編輯框當(dāng)前字體LOGFONT logfont;CFont m_font;tempfont->GetLogFont(&logfont);CFontDialog fontdlg(&logfont);/初始化字體信息if (fontdlg.DoModal()=IDOK)m_font.Detach();LOGFONT temp;fontdlg.GetCurrentFont(&temp);/獲取當(dāng)前字體信息m_font.CreateFontIndirect(&temp);/直接創(chuàng)建字體m_edit1.SetFont(&m_font);/設(shè)置字體4. 顏色對(duì)話框CColorDialog類是標(biāo)準(zhǔn)的“顏色”對(duì)話框,利用“顏色”對(duì)話框,可以選擇一種顏色,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論