《對話框及常用控》PPT課件.ppt_第1頁
《對話框及常用控》PPT課件.ppt_第2頁
《對話框及常用控》PPT課件.ppt_第3頁
《對話框及常用控》PPT課件.ppt_第4頁
《對話框及常用控》PPT課件.ppt_第5頁
已閱讀5頁,還剩93頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八講 對話框及常用控件,中國地質(zhì)大學(xué)(武漢) 計算機學(xué)院,計算機高級語言(C+),本章內(nèi)容主要包括包含控件的對話框資源的建立,對話框類和對話框資源的關(guān)聯(lián),利用對話框類來操縱對話框資源,對話框的消息處理,對話框框中控件的訪問。 要求了解控件的使用、對話框資源的建立方法和常見屬性的含義,熟悉利用控件屬性,對話框設(shè)置控件屬性的方法及常見控件屬性的含義,掌握對對話框消息WM_INITDIALOG的響應(yīng),會利用類向?qū)砑涌丶兞亢拖⒂成浜瘮?shù),熟練掌握控件類型的無關(guān)訪問。,教學(xué)要點,對話框及常用控件,8.1 對話框概述 8.2 對話框程序的創(chuàng)建 8.3 標(biāo)準(zhǔn)Windows控件,8.1 對話框概述,界面是Windows程序設(shè)計中的一種重要的接口對話框和控件也是組成界面的重要元素。如何編寫基于對話框的應(yīng)用程序,在界面中放置什么樣的控件。當(dāng)創(chuàng)建了一個包含各種控件的對話框資源后,控件如何來響應(yīng)用戶的各種操作。 本節(jié)內(nèi)容: 8.1.1 對話框簡介 8.1.2 對話框的分類 8.1.3 對話框的組成,8.1.1 對話框簡介,對話框是一種用戶界面,它為用戶提供了一種標(biāo)準(zhǔn)的處理數(shù)據(jù)的方法。因為大部分的對話框是作為對菜單的單擊響應(yīng)而顯示出來的(在Word軟件中,單擊菜單項后有的菜單,看都會出現(xiàn)哪些對話框),因此對話框常常被看作是用戶菜單命令的擴(kuò)展。 從程序員角度來看,對話框和控件都是窗口,查看MSDN中的MFC組織圖可以看到,它們都是從CWnd類派生來的,這正好說明了“對話框和控件都是窗口”。因此,對對話框的操作,經(jīng)常要使用窗口的成員函數(shù)來進(jìn)行。,8.1.2 對話框的分類,1模態(tài)對話框 在對話框關(guān)閉之前,用戶無法在應(yīng)用程序的其它窗口中進(jìn)行工作的對話框稱為模態(tài)對話框。例如Windows的各種應(yīng)用軟件中的Open File 對話框,用戶不能在應(yīng)用程序的其它地方工作,直到對話框關(guān)閉。 2非模態(tài)對話框 對話框保留在屏幕的同時,用戶還可以在應(yīng)用程序其它窗口中進(jìn)行工作的對話框稱為非模態(tài)對話框。例如,Word字處理軟件中的Find 和Replace對話框就是非模態(tài)對話框的一個很好的例子。,8.1.3 對話框的組成,對話框模板 對話框模板定義了對話框的特性(比如大小、位置和風(fēng)格)以及對話框中每個控件的類型和位置。程序員不僅可以使用對話框資源編輯器建立對話框資源模板外,還可以根據(jù)需要在內(nèi)存中創(chuàng)建對話框模板。當(dāng)對話框模板創(chuàng)建后,程序員好可以在創(chuàng)建和管理對話框時動態(tài)地改變部分控件的信息,如禁止、變灰、改變標(biāo)題和大小。 對話框模板可以看作對話框應(yīng)用程序的一種用戶接口,用戶在應(yīng)用程序的使用中,看到的都是對話框模板中的東西。,8.1.3 對話框的組成(續(xù)),對話框類 從CDialog類派生的對話框類提供編程接口來管理與對話框模板相關(guān)聯(lián)的對話框。CDialog類的許多成員函數(shù)與對話框編程密切相關(guān),可供程序員調(diào)用。由于對話框是一種窗口,因此相應(yīng)的對話框類必須與一個Windows窗口相聯(lián)系,而對話框資源模板就是用于創(chuàng)建這個Windows窗口及其包含在其中的控件。 對話框類可以看作對話框應(yīng)用程序的一種程序員接口,用戶對應(yīng)用程序操作,后臺調(diào)用的都是該類的成員函數(shù)來完成的。,8.2 對話框程序的創(chuàng)建,8.2.1 一個對話框程序 8.2.2 創(chuàng)建對話框資源模板 8.2.3 利用對話框類CDialog操縱對話框 8.2.4 初始化對話框 8.2.5 對話框的調(diào)用 8.2.6 對話框的消息處理,8.2.1 一個對話框程序,1程序功能 該應(yīng)用程序具有認(rèn)證的功能:當(dāng)該程序運行時,首先彈出一個“密碼驗證” 對話框,讓用戶輸入其用戶名和密碼。用戶需要輸入用戶名“good”和用戶密碼“good”后才能進(jìn)入主界面,若有一個輸入錯誤,都不能進(jìn)入。 2程序類型 該程序重點演示一個模態(tài)對話框,它是利用AppWizard創(chuàng)建的一個基于MFC的單文檔應(yīng)用程序。在該程序的主界面出現(xiàn)之前顯示“密碼驗證” 對話框。,靜態(tài)圖片,編輯框,靜態(tài)文本,組框,按鈕,復(fù)選框,單選框,組合框,列表框,列表視圖,樹形視圖,標(biāo)簽,8.2.2 創(chuàng)建對話框資源模板,資源文件(.rc)中有關(guān)描述對話框模板的文本,模板文件 對話框模板描述了對話框中各控件類型和排列位置,不論是模態(tài)還是非模態(tài)對話框,都需要對話框模板。對話框模板存儲在對話框資源中,這和菜單類似。對話框資源中存儲的是對話框腳本,為了了解資源的腳本,我們查看一下腳本文件MfcExam.rc,屏幕看到的是生成的單文檔應(yīng)用程序的對話框的腳本。,8.2.3 利用對話框類CDialog操縱對話框,1利用類向?qū)?chuàng)建對話框類 進(jìn)入類向?qū)Ш?,如果從未給剛才建立的對話框資源模板建立對應(yīng)的對話框類,則類向?qū)l(fā)現(xiàn)這是一個新的對話框資源模板,類向?qū)釂柺欠褚獮檫@個新的對話框資源模板創(chuàng)建一個新的類。選擇“OK”按鈕,會彈出一個Create New Class的對話框。若選擇Cancel后,也可以在類向?qū)е型ㄟ^增加一個新類的方法來添加對話框資類。不管哪種情況,都是在所出現(xiàn)的對話框的Name欄中輸入對話框類的名字CPassWordDlg,Bass Dialog欄選擇CDialog,Dialog ID欄選擇先前創(chuàng)建的新對話框源模板的標(biāo)識符IDD_DIALOG_USER(如圖所示)。,對話框類的建立界面,2利用類向?qū)砑訉υ捒蝾惖某蓡T變量 為了對編輯框輸入的數(shù)據(jù)進(jìn)行控制,需要在對話框類中增加與這些控件有關(guān)的類的成員變量。 按Ctrl+W打開類向?qū)υ捒颍x擇MFC ClassWizard對話框中的Member Variable標(biāo)簽,然后在Class Name欄中選擇對應(yīng)的CPassWordDlg對話框類,此時在下面該類的變量列表中會出現(xiàn)該對話框中的各控件的資源ID號。,雙擊Controls IDs列表中的編輯框控件的資源ID號ID_EDIT_USERNAME,在Category欄中選擇Value(值變量)(還有一種控件型變量Control),在Value Type欄中選擇CString類型。這些操作的界面如圖所示。用用樣的方法再增加一個變量m_strPassword。,利用對話框類CDialog操縱對話框(續(xù)),按OK按鈕后,這兩個類的成員變量m_strUserName和m_strPassword就被加入到CPasswordDlg類的定義中,定位到該類的頭文件PassDlg.h中,找到如下的幾行代碼:,class CPassWordDlg : public CDialog / Construction public: CPassWordDlg(CWnd* pParent = NULL); / standard constructor / Dialog Data /AFX_DATA(CPassWordDlg) enum IDD = IDD_DIALOG_USER ; CString m_strPassword; /通過類向?qū)г黾拥淖址兞?,保存密碼 CString m_strUserName; /通過類向?qū)г黾拥淖址兞?,保存用戶名稱 /AFX_DATA,8.2.4 初始化對話框,如何初始化各種類型的數(shù)據(jù)對象是很重要的,當(dāng)處理像對話框這樣復(fù)雜對象時,由于它的初始化工作放在多個階段,所以需要注意次序問題。對話框的初始化工作可以在下面的三個階段進(jìn)行:構(gòu)造函數(shù)、對WM_CREATE消息的響應(yīng)和對WM_INITDIALOG消息的響應(yīng)。,8.2.4 初始化對話框(續(xù)),1在構(gòu)造函數(shù)中初始化 從C+的觀點看,在類的構(gòu)造函數(shù)中,應(yīng)該初始化類的數(shù)據(jù)成員,但是,在MFC應(yīng)用程序中應(yīng)盡量避免在構(gòu)造函數(shù)中完成太多的工作,因為構(gòu)造函數(shù)沒有返回失敗條件的方法,無法報告其中的失敗信息(除非使用異常處理)。 在前面的例子中,變量m_strPasswor和m_strUserName的初始化就是在對話框類的構(gòu)造函數(shù)中進(jìn)行的,下面是構(gòu)造函數(shù)的實現(xiàn)代碼。,CPassWordDlg:CPassWordDlg(CWnd* pParent /*=NULL*/) : CDialog(CPassWordDlg:IDD, pParent) /AFX_DATA_INIT(CPassWordDlg) m_strPassword = _T(“); /成員變量初始化為空 m_strUserName = _T(“); /AFX_DATA_INIT 可見在對話框的構(gòu)造函數(shù)中主要是對對話框的數(shù)據(jù)成員變量進(jìn)行初始化。,8.2.4 初始化對話框(續(xù)),2在WM_CREATE的消息映射函數(shù)中初始化 由于對話框也是窗口,它在窗口創(chuàng)建時會收到WM_CREATE消息,該消息的響應(yīng)函數(shù)是OnCreate()。這樣,就能在窗口創(chuàng)建中做一些初始化工作。盡管用戶可能在WM_CREATE消息處理函數(shù)中進(jìn)行一些數(shù)據(jù)成員的初始化工作,但更通常的做法是在對話框中的所有控件都建立起來之后,響應(yīng)消息WM_INITDIALOG時,對數(shù)據(jù)成員進(jìn)行初始化。 3在WM_INITDIALOG的消息映射函數(shù)中初始化 在對話框創(chuàng)建時,會收到WM_INITDIALOG消息,該消息的響應(yīng)函數(shù)是OnInitDialog()。在得到了,8.2.4 初始化對話框(續(xù)),WM_INITDIALOG消息時,對話框處于一個特殊的狀態(tài),首先,當(dāng)我們獲得該消息時,對話框框架已經(jīng)建立起來,對話框的窗口句柄已經(jīng)有效;其次,各個控件也建立起來并放在適當(dāng)?shù)牡胤剑坏谌?,對話框控件還沒有顯示出來。因此,一般在OnInitDialog()函數(shù)中作一些影響對話框外觀的初始化工作,如可以設(shè)置或優(yōu)化對話框中各個控件的外觀、大小尺寸、位置及其它內(nèi)容。 一般來說,在創(chuàng)建對話框及其所有的控件后,就在對話框即將顯示之前將調(diào)用CDialog的成員函數(shù)OninitDialog()來初始化對話框。對于模態(tài)對話框,在調(diào)用DoModal()時調(diào)用OninitDialog(),而對于非模態(tài)對話框,在調(diào)用Create()時調(diào)用OninitDialog() 。,8.2.5 對話框的調(diào)用,由于對話框是一種輸入界面,因而牽涉到在程序的什么地方、什么時候調(diào)用的問題,這實質(zhì)上是創(chuàng)建的對話框類和程序如何交互的問題。根據(jù)不同的應(yīng)用程序類型和程序的功能,其調(diào)用的方法也不同。 1在程序主窗口顯示前調(diào)用 我們已經(jīng)創(chuàng)建了密碼驗證MfcExam程序的對話框模板IDD_DIALOG_USER、對話框類CPassWordDlg,緊接著編寫調(diào)用對話框的代碼。由于密碼驗證是在應(yīng)用程序的主框架顯示之前進(jìn)行,因此密碼驗證對話框的調(diào)用必須在應(yīng)用程序主框架顯示之前就完成,很顯然它不能在視圖類中靠和用戶交互進(jìn)行。,8.2.5 對話框的調(diào)用(續(xù)),應(yīng)用程序類是控制整個應(yīng)用程序的運行,它建立的時間最早,因此我們可以把對話框的調(diào)用放到應(yīng)用程序類中的InitInstance()中完成。 (1)在應(yīng)用程序類中添加文件包含宏 打開應(yīng)用程序類的實現(xiàn)文件MfcExamApp.cpp,在文件的頭件的定義處,添加文件包含的宏指令:,#include “stdafx.h“ #include “MfcExam.h“ #include “MainFrm.h“ #include “MfcExamDoc.h“ #include “MfcExamView.h“ #include “PassWordDlg.h” /需要使用用戶登陸對話框,必須包含它 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif,(2)超載應(yīng)用程序類的虛函數(shù)InitInstance() BOOL CMfcExamApp:InitInstance() . /以下為用戶添加的代碼 CPassWordDlg dlg; /如果點擊“取消”按鈕 if(dlg.DoModal()!=IDOK) return FALSE; /如果輸入的用戶名、密碼不正確 if(strcmp(dlg.m_strPassword,“good“)!=0) |(strcmp(dlg.m_strUserName,“good“)!=0) MessageBox(NULL,“用戶名或密碼錯誤,請重試!“, “錯誤信息“,MB_OK|MB_ICONERROR); return FALSE; ,8.2.5 對話框的調(diào)用(續(xù)),2在基于對話框的應(yīng)用程序中調(diào)用 基于對話框的應(yīng)用程序的類型比較簡單,當(dāng)程序運行后,就自動顯示一個對話框的界面。倘若我們程序的輸入界面就是它(例如Windows中的計算器程序),則對話框的調(diào)用的代碼在向?qū)е幸呀?jīng)完成,我們沒有必要編寫,但必須知道在什么地方調(diào)用的。 3通過用戶交互對象菜單、工具欄調(diào)用 在基于文檔/視圖結(jié)構(gòu)的應(yīng)用程序中,由于對話框大部分用作用戶的輸入與輸出界面,因此對話框的調(diào)用應(yīng)該在視圖類中完成。這在前面和后面的章節(jié)都會出現(xiàn)(自己琢磨)。一般來說,對話框的調(diào)用在選擇菜單項、工具欄、加速鍵或按了鼠標(biāo)鍵、鍵盤鍵等觸發(fā)。,8.2.6 對話框的消息處理,1對話框本身的消息 一般在一個對話框中有多個按鈕,其中只有一個按鈕是缺省按鈕。在缺省按鈕的四周有一個虛線矩形框,缺省按鈕的作用在于用戶不需要用鼠標(biāo)單擊它,只需按回車鍵就等同于單擊它,這減輕了用戶的負(fù)擔(dān)。在應(yīng)用程序中,要想改變或設(shè)置對話框中的缺省按鈕,只需要使用SendMessage()發(fā)送一個對話框的消息 DM_GETDEFID或DM_SETDEFID即可。 2窗口消息 由于對話框是窗口,所以WM_開始的Windows消息,在對話框中類中都可以處理,在ClassWizard窗口的MessageMaps選項頁的Messages列表框中顯示的就是對話框可以處理的消息,其中包含了很多窗口消息。,8.2.6 對話框的消息處理(續(xù)),3控件通知消息 我們可以像對待框架窗口類和視圖類一樣,向?qū)υ捒蛑械呐缮愔袨閃M_消息增加消息映射,但卻不能對話框中控件的通知消息增加ON_COMMAND消息映射宏,因為控件的通知消息包含有不同的通知代碼。控件的通知消息主要指一個對話框中所包含的控件自己可以接收到的消息。例如EN_CHANGE就是一個編輯框內(nèi)容改變的控件通知消息(Edit Notification Changed)。在Windows對話框應(yīng)用程序中,當(dāng)要對其中的控件進(jìn)行全面的控制時,就要通過類向?qū)υ捒蛑械目丶砑涌丶耐ㄖ⒂成洹?【例8-2】在前述程序的基礎(chǔ)上,通過發(fā)送消息DM_SETDEFID將密碼對話框中的缺省按鈕設(shè)置為“確定”,在WM_INITDIALOG的消息響應(yīng)函數(shù)中將“取消”按鈕的大小改變,同時處理“用戶名稱”編輯框的通知消息EN_CHANGE。步驟如下: (1)利用類向?qū)砑訉υ捒蝾怌PassWordDlg對WM_INITDLG的消息映射函數(shù)OnInitDialog(),并編寫代碼。 (2)利用類向?qū)砑泳庉嬁蚩丶蘒DC_EDIT_USERNAME的通知消息EN_CHANGE的響應(yīng)函數(shù)OnChangeEditUsername(),并編寫代碼。,void CPassWordDlg:OnChangeEditUsername() UpdateData(true); /將編輯框輸入的內(nèi)容更新到變量m_strUserName中 if(m_strUserName.Compare(“BenLaDeng“)=0) /如果在用戶名稱編輯框中輸入“BenLaDeng”,則找見了系統(tǒng)的后門 MessageBox(“恭喜您找到后門,不用輸入密碼就可進(jìn)入系統(tǒng)“); m_strUserName=“good“; m_strPassword=“good“; UpdateData(false); SendMessage(WM_COMMAND, IDOK,BN_CLICKED); /向確定按鈕發(fā)送單擊消息BN_CLICKED ,8.3 標(biāo)準(zhǔn)Windows控件,本節(jié)內(nèi)容 8.3.1 控件簡介 8.3.2 靜態(tài)控件 8.3.3 按鈕控件 8.3.4 編輯控件 8.3.5 列表框控件 8.3.6 組合框控件 8.3.7 控件的類型無關(guān)訪問 8.3.8 動畫控件,8.3.1 控件簡介,在Windows應(yīng)用程序中,菜單系統(tǒng)是用來實現(xiàn)用戶與程序進(jìn)行交互最基本的途徑,但僅僅使用菜單來完成這種交互,往往并不方便,有時甚至是難以勝任的。其實,Windows操作系統(tǒng)的一個重要特性就是友好的用戶界面。對于編程人員,它也提供了各種控件來實現(xiàn)直觀、方便、快捷的交互。在上一節(jié)我們使用過對話框,在對話框中的靜態(tài)文本、圖像以及各種按鈕都是控件??丶–ontrol,也稱為控制框)是一種子窗口,應(yīng)用程序用它來與其它窗口一起完成簡單的輸入輸出操作。 作為一般窗口,控件具有許多通用窗口屬性,因此控件可以像操作窗口那樣使用ShowWindow()、MoveWindow()等窗口管理函數(shù)來顯示或隱藏控件、改變控件的位置和尺寸以及其它的操作。,8.3.1 控件簡介(續(xù)),控件創(chuàng)建方式有兩種。 一種是在對話框模板中放置控件,當(dāng)應(yīng)用程序啟動該對話框時,Windows系統(tǒng)就會為對話框創(chuàng)建控件,這種方法是可視化的編程方式,所見即所得,本書的大多數(shù)對話框程序都使用這種方式來創(chuàng)建。 另一種方式是通過CreateWindow()或CreateWindowEx()函數(shù)來創(chuàng)建控件,這時必須指定控件的窗口類,每個控件都應(yīng)屬于某個窗口類,這個窗口類可以在應(yīng)用程序中定義并注冊,但在更多的情況下,程序員使用的Windows系統(tǒng)預(yù)定義好的窗口類。,靜態(tài)圖片,編輯框,靜態(tài)文本,組框,按鈕,復(fù)選框,單選框,組合框,列表框,列表視圖,樹形視圖,標(biāo)簽,8.3.2 靜態(tài)控件,靜態(tài)控件在MFC中是靠CStatic類來管理的,它是一種單向交互的控件,只能支持應(yīng)用程序的輸出,而不能用來響應(yīng)用戶的輸入,也就是說,它可以接收消息,但基本上不會發(fā)送消息。 靜態(tài)控件是多種多樣的。在VC集成環(huán)境中,Controls工具欄中的Static Text(靜態(tài)文本)、Picture(圖片控件)和Group Box(成組框)分別用來創(chuàng)建文字、圖形和由一個方框和一個字符串組成的成組框這三種靜態(tài)控件。 Static Text、Picture和Group Box均對應(yīng)CStatic類型的對象,通常可選用對話框模板編輯器自動提供的缺省標(biāo)識符IDC_STATIC,此時靜態(tài)控件只是起到一種標(biāo)識的作用。,8.3.2 靜態(tài)控件(續(xù)),1常見屬性 在對話框的應(yīng)用程序中,想要查看某類控件的屬性,先選中該類控件,然后按Alt和回車鍵,就會彈出控件的屬性設(shè)置對話框。下圖是靜態(tài)控件的屬性窗口。,圖8.6 靜態(tài)控件屬性設(shè)置窗口圖,8.3.2 靜態(tài)控件(續(xù)),2常用方法 靜態(tài)控件類CStatic的成員函數(shù)見下表。,8.3.2 靜態(tài)控件(續(xù)),3常用消息 由于靜態(tài)控件只用作輸出,而不用作輸入,因此一般不處理它的消息,但它也有一個BN_CLICKED的消息。要想處理該消息,該控件的屬性必須選中屬性窗口Style選項頁下的Notify復(fù)選框,并且修改其默認(rèn)的資源標(biāo)識符IDC_STATIC為其它的值。,8.3.3 按鈕控件,按鈕控件是一個小的矩形窗口,它們可以被單獨或成組使用。典型的按鈕控件有下壓按鈕(push button)、單選按鈕(radio button)和復(fù)選框(check box),它們在外觀和使用上都有很大的差異,但在MFC中都是用一個類CButton來封裝的。下壓按鈕通常立即產(chǎn)生某個動作,執(zhí)行某個命令,因此又叫命令按鈕。單選按鈕的外形是一個圓圈,當(dāng)它被選中時,就會出現(xiàn)一個小黑點。復(fù)選框為一個空心方框,當(dāng)它被選中時,就會出現(xiàn)一個“”標(biāo)記。通常復(fù)選框只有選中和未選中兩種狀態(tài)。,8.3.3 按鈕控件(續(xù)),1常見屬性 在對話框的應(yīng)用程序中,選中所添加的按鈕控件,然后按ALT和回車鍵盤,就會彈出按鈕控件的屬性設(shè)置對話框,如圖所示。,8.3.3 按鈕控件(續(xù)),按鈕控件常見屬性有:Visible(可視性)、Caption(顯示在控件上的標(biāo)簽文本)、Disableed(是否為不接收用戶輸入的禁止?fàn)顟B(tài))、Group(控件不僅可以單獨使用,而且還可以幾個編成一組。該屬性用于指定同組控件中的第一個控件。在同組控件中用戶可以使用箭頭鍵在控件之間移動,它以Tab order為序,在該控件之后的所有該屬性值為False的控件將被視為同一組控件,直到遇上Group屬性為True的控件為止)、Table stop(是否可以使用TAB鍵來定位到該控件)等。,8.3.3 按鈕控件(續(xù)),2常用方法 按鈕控件的操作是通過CButton類的成員函數(shù)來操作,下表為按鈕類CButton的成員函數(shù)。,8.3.3 按鈕控件(續(xù)),3常用消息 下表為常見的按鈕通知消息中附帶的通知代碼。,8.3.4 編輯控件,編輯控件是一個讓用戶從鍵盤輸入并編輯文字的矩形窗口,用戶可以通過它方便地輸入各種文字、數(shù)字或者口令,也可使用它來編輯或修改簡單的文本文件。若用戶在編輯控件內(nèi)單擊鼠標(biāo),或者按Tab鍵,就可以選中一個編輯控制框,并賦予它輸入焦點。被選中后,編輯控制框中將顯示其文本和一個表明插入點的位置的閃爍的插入符,然后用戶就可以用鍵盤或者鼠標(biāo)來輸入文本,移動插入點,或者選擇將移動或刪除的文本。,1常見屬性 在對話框應(yīng)用程序中,選中所添加的編輯框控件,然后按ALT和回車鍵,就會彈出編輯框控件屬性設(shè)置對話框。,8.3.4 編輯控件(續(xù)),2常用方法 編輯框控件操作是通過CEdit類的成員函數(shù)來操作,表中為編輯框控件類CEdit的成員函數(shù)。,3常用消息,表中是常見的編輯框通知消息。,4實例 【例8-3】一個演示靜態(tài)文本控件、按鈕控件和編輯框控件的程序。它能求數(shù)一和數(shù)二的最大公約數(shù)和最小公倍數(shù)。 (1)創(chuàng)建一個基于對話框的應(yīng)用程序GcdExam,向?qū)傻拿總€步驟都使用缺省的。 (2)在對話框資源IDD_GCDEXAM_DIALOG中添加控件如下圖所示。,在對話框中,設(shè)置控件的屬性如下表所示,例8-3 (續(xù)),(3)添加單選按鈕的消息映射 前面講的所有程序中的消息映射的添加都是通過ClassWizard來進(jìn)行的,但有時想要處理的消息在類向?qū)е袥]有,或者需要對一些特殊的情況要處理(如本例子,想用一個消息響應(yīng)函數(shù)OnGcd響應(yīng)多個ON_COMMAND消息)時,當(dāng)有很多個命令的功能類似,可以設(shè)置它們的ID號為連續(xù)的,再在消息映射中處理。ClassWizard不支持這種功能,程序員必須手工在消息映射中添加這類映射項。對于本程序,我們希望單擊“最大公約數(shù)”或“最小公倍數(shù)”時,都執(zhí)行同一個消息映射函數(shù)OnGcd(UINT nID),然后在映射函數(shù)再做進(jìn)一步的處理。手工添加消息映射函數(shù)的步驟為:,對話框類CGcdExamDlg頭文件GcdExamDlg.h中添加消息映射函數(shù)原型說明。 class CGcdExamDlg : public CDialog public: CGcdExamDlg(CWnd* pParent = NULL); / standard constructor / Generated message map functions /AFX_MSG(CGcdExamDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnGcd(UINT nID); /手工添加的消息映射函數(shù)原型說明 /AFX_MSG DECLARE_MESSAGE_MAP() ;,在對話框類CGcdExamDlg的實現(xiàn)文件GcdExamDlg.cpp中添加消息映射。 BEGIN_MESSAGE_MAP(CGcdExamDlg, CDialog) /AFX_MSG_MAP(CGcdExamDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND_RANGE(IDC_RADIO1, IDC_RADIO2, OnGcd) /AFX_MSG_MAP END_MESSAGE_MAP() ,在對話框類CGcdExamDlg的實現(xiàn)文件GcdExamDlg.cpp中實現(xiàn)消息映射函數(shù)。 void CGcdExamDlg:OnGcd(UINT nID) UpdateData(true); /將前臺輸入到界面中的數(shù)據(jù)保存到后臺變量中 int p,q,r; p=min(m_nSource1,m_nSource2); /p為兩者的較小者 q=max(m_nSource1,m_nSource2);/q為兩者的較大者 if (nID=IDC_RADIO1) /求最大公約數(shù)的話(利用歐幾里德算法) while(r=q%p) q=p; p=r; m_nResult=p; /p為最大公約數(shù),放到變量m_nResult中顯示 if (nID=IDC_RADIO2) /求最小公倍約數(shù)的話 r=p; /p為較小者 while(p%q!=0) /p不能被q整除的話 p+=r; /一直累加原較小者,直到累加結(jié)果能被原較大者整除 m_nResult=p; /p為最大公約數(shù),放到變量m_nResult中顯示 UpdateData(false); /將后臺更改的數(shù)據(jù)送到前臺加以顯示 ,8.3.5 列表框控件,列表框是一個放有用戶可以選擇的對象列表項的控制窗口,這些列表項一般是以字符串形式或圖形形式來給出。它與單選按鈕組或復(fù)選框組一樣,都可以讓用戶在其中選擇一個或多個項,但不同的是,列表框中項的數(shù)目是可靈活變化的,程序運行時可往列表框中添加或刪除某些項。并且當(dāng)列表框中的數(shù)目較多,列表框不能一次全部顯示時,就可以提供滾動條來拓展顯示范圍。,8.3.5 列表框控件(續(xù)),1常見屬性 在對話框的應(yīng)用程序中,選中所添加的列表框控件,然后按鼠標(biāo)右鍵彈出菜單,選擇“Properities”菜單項,就會彈出列表框控件的屬性設(shè)置對話框,如下圖所示。,8.3.5 列表框控件(續(xù)),2常用方法 列表框控件的操作是通過CListBox類的成員函數(shù)來操作,下表為列表框控件類CListBox的成員函數(shù)。,8.3.5 列表框控件(續(xù)),3常用消息 列表框的操作,不僅可以調(diào)用CListBox類的成員函數(shù)來進(jìn)行,還可以通過發(fā)送消息給列表框來進(jìn)行。 (1)發(fā)送消息到列表框 當(dāng)列表框創(chuàng)建出來之后,往往要添加、刪除、修改或檢查列表框中的項,列表框的項除了用字符串來指定外,還往往通過索引來確定。索引表明某項在列表框中排列的位置,它以0為基準(zhǔn),即列表框中的第一項索引為0,第二項索引為1,依此類推。,8.3.5 列表框控件(續(xù)),(2)列表框發(fā)出的通知消息 當(dāng)列表框發(fā)生了某個事件,如用戶雙擊了列表框中的某一項,列表框就會向其所屬的主窗口發(fā)送一條通知消息。列表框的通知消息是以帶參數(shù)的WM_COMMAND消息的形式來發(fā)送的。,8.3.5 列表框控件(續(xù)),這時WM_COMMAND的wParam參數(shù)的高位字就是通知代碼,低位字是列表框的資源標(biāo)識符,lParam參數(shù)則是列表框的句柄。 常見的列表框通知消息有三條:LBN_SELCHANGE表示列表框中的選擇將要改變,LBN_DBLCLK 表示用戶雙擊了列表框中的某一項,LBN_SELCANCEL表示用戶取消了對列表框中的某一項選擇。,8.3.6 組合框控件,一個組合框是一個列表框和編輯框控件或者靜態(tài)文本框控件的組合。控件的列表部分可以始終顯示,也可以當(dāng)用戶單擊了下拉箭頭時才打開,當(dāng)前選擇的內(nèi)容在靜態(tài)文本框或編輯框中顯示。另外,若組合框具有下拉列表風(fēng)格,用戶可以鍵入列表框中的某個選項的開始字符來選擇它。如果列表框的內(nèi)容是可見的,列表框?qū)验_頭內(nèi)容與用戶鍵入內(nèi)容相匹配的第一項高亮度顯示。,8.3.6 組合框控件(續(xù)),1.常見屬性 在對話框的應(yīng)用程序中,選中所添加的組合框控件,然后按鼠標(biāo)右鍵彈出菜單,選擇Properities菜單項,就會彈出組合框控件的屬性設(shè)置對話框,如下圖所示。,8.3.6 組合框控件(續(xù)),2.常用方法 組合框控件的操作是通過CComboBox類的成員函數(shù)來操作,下表為組合框控件類CcomboBox常用的成員函數(shù)。,8.3.6 組合框控件(續(xù)),3.常用消息 列表框的操作,不僅可以調(diào)用CComboBox類的成員函數(shù)來進(jìn)行,還可以通過發(fā)送消息給組合框來進(jìn)行,因此,首先要熟悉可以發(fā)送到組合框中的消息有哪些。,8.3.6 組合框控件(續(xù)),(1)發(fā)送消息到組合框 發(fā)給到組合框的消息大體分為兩類:一類是作用于組合框中的列表部分,另一類是作用于組合框中的編輯控件,它們分別與發(fā)送給列表框和編輯框控件的消息存在對應(yīng)關(guān)系。 作用于組合框中的列表框的消息有CB_ADDSTRING、CB_INSERTSTRING、CB_DELETESTRING等,它們分別對應(yīng)于發(fā)給列表框中的消息LB_ADDSTRING、LB_INSERTSTRING、 LB_DELETESTRING等。 作用于組合框中的編輯框的消息有CB_GETEDITSEL、CB_SETEDITSEL、WM_CUT等。,8.3.6 組合框控件(續(xù)),(2)組合框發(fā)出的通知消息 組合框發(fā)出的通知代碼也包含在WM_COMMAND消息的wParam參數(shù)高位字節(jié)中,它們與列表框以及組合框的通知消息存在一一對應(yīng)關(guān)系。CBN_DBCLICK表示用戶雙擊了一個列表項, CBN_SELCHANGE表示用戶當(dāng)前的選擇發(fā)生了變化,CBN_CLOSEUP表示下拉列表框的列表即將被關(guān)閉,CBN_DROPDOWN表示表示下拉列表框的列表即將被打開等。,例8-4,【例8-4】一個練習(xí)列表框與組合框的實例。本實例側(cè)重對話框界面控件的放置和屬性的設(shè)置。 (1)程序功能:程序運行后的界面如下圖所示。在列表框中選擇汽車的品牌,左邊就會顯示相應(yīng)汽車的圖片和注釋文字;同時,通過字體組合框開可以選擇注釋文字的字體。,例8-4(續(xù)),(2)生成程序:利用應(yīng)用程序向?qū)?chuàng)建一個基于對話框的應(yīng)用程序StaticControl,向?qū)傻拿總€步驟都使用缺省的。 (3)添加控件: 在對話框資源IDD_STATICCONTROL_DIALOG 中添加如上頁圖所示的幾種控件。顯示圖片的Picture圖片控件、選擇汽車的列表框控件、選擇字體的組合框控件、顯示汽車注釋的靜態(tài)文本控件。 (4)增加位圖資源:用鼠標(biāo)右鍵單擊ClassView選項卡的最頂端,在彈出出式菜單中選擇“Import”導(dǎo)入命令,將外部的一些汽車圖片載入應(yīng)用程序的資源中,共導(dǎo)入八張圖片,其資源的ID號從IDB_BITMAP1到IDB_BITMAP8。,例8-4(續(xù)),(5)設(shè)置控件的屬性:控件的主要屬性設(shè)置與對應(yīng)的成員變量, WM_INITDIALOG的消息映射函數(shù)代碼 BOOL CStaticControlDlg:OnInitDialog() /主要進(jìn)行列表框中可選項內(nèi)容的填寫 CDialog:OnInitDialog(); /向?qū)傻拇a /以下為手工添加的代碼 /通過向列表框發(fā)送消息的方法來訪問列表框(向列表框中增加選項) SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“高爾夫“); SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“標(biāo) 致“); SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“別 克“); SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“寶 馬“); /使用類型無關(guān)的方法來訪問列表框 CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LIST1); pListBox-AddString(“奧 迪“); pListBox-AddString(“馬自達(dá)“); pListBox-AddString(“甲克蟲“); pListBox-AddString(“奔 馳“); /設(shè)置列表框的初始位置為0 pListBox-SetCurSel(0); /設(shè)置字體組合框的初始位置為0,通過控件變量的方式來訪問 m_ComboxFont.SetCurSel(0); , 組合框控件CBN_CLOSEUP的消息響應(yīng)函數(shù)OnCloseupCombo1() void CStaticControlDlg:OnCloseupCombo1() /在該函數(shù)中,實現(xiàn)字體的選擇 /顯示汽車的描述文字 char *CarIntroduce8=“高爾夫-德國名車,世界經(jīng)典兩相轎車“,“標(biāo)致-法國名車,線條流暢,造型時尚“,“別克-美國名車,空間寬敞,視野開闊“,“寶馬-德國名車,動力充沛,操控靈活“, “奧 迪-德國名車,工藝精細(xì),配置齊全“,“馬自達(dá)-日本名車,懸掛偏硬,轉(zhuǎn)向靈活“,“甲克蟲-德國名車,外型圓滑,提速很快“,“奔 馳-德國名車,造型流暢,充滿活力“; UpdateData(true); /獲得靜態(tài)文本框控件IDC_STATIC1的窗口指針和設(shè)備環(huán)境 CStatic *pTxt=(CStatic *)GetDlgItem(IDC_STATIC1); CDC *pDC=pTxt-GetDC(); /獲得靜態(tài)文本框控件IDC_STATIC1的客戶區(qū)域 CRect rc; pTxt-GetClientRect(,/設(shè)置文字的色彩并輸出文字 pDC-SetBkColor(RGB(0,255,0);/設(shè)置背景色 pDC-SetBkMode(TRANSPARENT); /設(shè)置顯示模式為透明 pDC-SetTextColor(RGB(0,0,255);/設(shè)置文本顏色 CFont font; /創(chuàng)建字體 VERIFY(font.CreatePointFont(160,m_FontName,pDC); pDC-SelectObject( ,列表框控件CBN_SELCHANGE的消息響應(yīng)函數(shù)OnSelchangeList1() 在該函數(shù)中,實現(xiàn)汽車圖片的選擇并顯示: void CStaticControlDlg:OnSelchangeList1() /通過向?qū)υ捒蛑械目丶l(fā)消息拉取列表框中的選擇 short bmpNo=SendDlgItemMessage(IDC_LIST1,LB_GETCURSEL,0,0); bmpNo+; /顯示汽車的圖片 /獲得靜態(tài)文本框控件IDC_STATIC1的窗口指針和設(shè)備環(huán)境 CStatic *pTxt=(CStatic *)GetDlgItem(IDC_STATIC2); CBitmap MyBitmap; switch(bmpNo) case 1: MyBitmap.LoadBitmap(IDB_BITMAP1); break; case 2: MyBitmap.LoadBitmap(IDB_BITMAP2); break; case 3: MyBitmap.LoadBitmap(IDB_BITMAP3); break;,case 4: MyBitmap.LoadBitmap(IDB_BITMAP4); break; case 5: MyBitmap.LoadBitmap(IDB_BITMAP5); break; case 6: MyBitmap.LoadBitmap(IDB_BITMAP6); break; case 7: MyBitmap.LoadBitmap(IDB_BITMAP7); break; case 8: MyBitmap.LoadBitmap(IDB_BITMAP8); break; pTxt-SetBitmap(MyBitmap.operator HBITMAP(); /將選擇的位圖送到圖片控件中顯示 OnCloseupCombo1();/顯示汽車的描述文字 ,8.3.7 控件的類型無關(guān)訪問,面向?qū)ο蟪绦蛟O(shè)計觀點認(rèn)為,在應(yīng)用程序中只要獲得了應(yīng)用程序中某對象的指針,就可以實現(xiàn)對該對象的全面控制,那么在對話框的應(yīng)用程序中,如何獲得其中的任何一個控件呢? 對話框中的控件可以使用MFC控件類的接口進(jìn)行訪問,也可以創(chuàng)建控件對象并將其連接到對話框控件上來訪問。,8.3.7 控件的類型無關(guān)訪問(續(xù)),1使用成員函數(shù)GetDlgItem獲取某個資源ID的指針 調(diào)用CWnd 的成員函數(shù)GetDlgItem 返回一個指向給定控件的臨時對象的指針,并將返回值類型制轉(zhuǎn)換成適當(dāng)?shù)腃+控件類型。 2使用Class Wizard 建立Control型變量 使用Class Wizard 可以給某個控件建立與之關(guān)聯(lián)的兩類變量,一類是Value值類型變量,另一類是Control控件型變量。 如果只是簡單地訪問某一控件的值,那么利用類向?qū)Ыalue值類型變量。如果不僅僅是訪問某一控件的值,而且要實現(xiàn)對該控件的完全控制,就需要用ClassWizard 給該控件建立Control控件型變量。,8.3.7 控件的類型無關(guān)訪問(續(xù)),簡單來說,一種建立的是對話框類的普通型成員變量,另一類建立的是對象成員變量,該對象所屬的類型就是它的控件類型。 對話框類中的成員變量可以擁有Control屬性和Value 屬性。Value屬性指的是從控件所返回數(shù)據(jù)的類型(如CString或long等);Control屬性允許通過某一成員變量對控件進(jìn)行直接訪問,成員變量的類型必須是MFC控件類(如CEdit或CComboxList)之一。對于某一給定的控件,可以有多個具有Value屬性的成員變量,但最多只能有一個具有Control屬性的成員變量。,8.3.7 控件的類型無關(guān)訪問(續(xù)),具有Control屬性的成員變量又稱為對象成員,可以使用對象成員調(diào)用控件的任何成員函數(shù)進(jìn)行操作。例如,對于由m_checkboxDefault變量表示的CButton類型的復(fù)選框控件,可以用m_checkboxDefault.SetState(TRUE)來設(shè)置控件的狀態(tài)。如果復(fù)選框不是自動復(fù)選框,那么對話

溫馨提示

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

評論

0/150

提交評論