




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第八講 對話框及常用控件中國地質(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 標準Windows控件8.1 對話框概述 界面是Wind
2、ows程序設(shè)計中的一種重要的接口對話框和控件也是組成界面的重要元素。如何編寫基于對話框的應(yīng)用程序,在界面中放置什么樣的控件。當創(chuàng)建了一個包含各種控件的對話框資源后,控件如何來響應(yīng)用戶的各種操作。 本節(jié)內(nèi)容: 8.1.1對話框簡介 8.1.2對話框的分類 8.1.3對話框的組成8.1.1對話框簡介 對話框是一種用戶界面,它為用戶提供了一種標準的處理數(shù)據(jù)的方法。因為大部分的對話框是作為對菜單的單擊響應(yīng)而顯示出來的(在Word軟件中,單擊菜單項后有的菜單,看都會出現(xiàn)哪些對話框),因此對話框常常被看作是用戶菜單命令的擴展。 從程序員角度來看,對話框和控件都是窗口,查看MSDN中的MFC組織圖可以看到,
3、它們都是從CWnd類派生來的,這正好說明了“對話框和控件都是窗口”。因此,對對話框的操作,經(jīng)常要使用窗口的成員函數(shù)來進行。 8.1.2對話框的分類 1模態(tài)對話框 在對話框關(guān)閉之前,用戶無法在應(yīng)用程序的其它窗口中進行工作的對話框稱為模態(tài)對話框。例如Windows的各種應(yīng)用軟件中的Open File 對話框,用戶不能在應(yīng)用程序的其它地方工作,直到對話框關(guān)閉。 2非模態(tài)對話框 對話框保留在屏幕的同時,用戶還可以在應(yīng)用程序其它窗口中進行工作的對話框稱為非模態(tài)對話框。例如,Word字處理軟件中的Find 和Replace對話框就是非模態(tài)對話框的一個很好的例子。 8.1.3對話框的組成 對話框模板 對話框
4、模板定義了對話框的特性(比如大小、位置和風(fēng)格)以及對話框中每個控件的類型和位置。程序員不僅可以使用對話框資源編輯器建立對話框資源模板外,還可以根據(jù)需要在內(nèi)存中創(chuàng)建對話框模板。當對話框模板創(chuàng)建后,程序員好可以在創(chuàng)建和管理對話框時動態(tài)地改變部分控件的信息,如禁止、變灰、改變標題和大小。 對話框模板可以看作對話框應(yīng)用程序的一種用戶接口,用戶在應(yīng)用程序的使用中,看到的都是對話框模板中的東西。8.1.3對話框的組成(續(xù)) 對話框類 從CDialog類派生的對話框類提供編程接口來管理與對話框模板相關(guān)聯(lián)的對話框。CDialog類的許多成員函數(shù)與對話框編程密切相關(guān),可供程序員調(diào)用。由于對話框是一種窗口,因此相
5、應(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)用程序具有認證的功能:當該程序運行時,首先彈出一個“密碼驗證” 對話框,讓用戶輸入其用戶名和密碼。用戶需要輸入用
6、戶名“good”和用戶密碼“good”后才能進入主界面,若有一個輸入錯誤,都不能進入。 2程序類型 該程序重點演示一個模態(tài)對話框,它是利用AppWizard創(chuàng)建的一個基于MFC的單文檔應(yīng)用程序。在該程序的主界面出現(xiàn)之前顯示“密碼驗證” 對話框。靜態(tài)圖片編輯框靜態(tài)文本組框按鈕復(fù)選框單選框組合框列表框列表視圖樹形視圖標簽8.2.2創(chuàng)建對話框資源模板資源文件(.rc)中有關(guān)描述對話框模板的文本 模板文件 對話框模板描述了對話框中各控件類型和排列位置,不論是模態(tài)還是非模態(tài)對話框,都需要對話框模板。對話框模板存儲在對話框資源中,這和菜單類似。對話框資源中存儲的是對話框腳本,為了了解資源的腳本,我們查看一
7、下腳本文件MfcExam.rc,屏幕看到的是生成的單文檔應(yīng)用程序的對話框的腳本。8.2.3利用對話框類CDialog操縱對話框 1利用類向?qū)?chuàng)建對話框類 進入類向?qū)Ш?,如果從未給剛才建立的對話框資源模板建立對應(yīng)的對話框類,則類向?qū)l(fā)現(xiàn)這是一個新的對話框資源模板,類向?qū)釂柺欠褚獮檫@個新的對話框資源模板創(chuàng)建一個新的類。選擇“OK”按鈕,會彈出一個Create New Class的對話框。若選擇Cancel后,也可以在類向?qū)е型ㄟ^增加一個新類的方法來添加對話框資類。不管哪種情況,都是在所出現(xiàn)的對話框的Name欄中輸入對話框類的名字CPassWordDlg,Bass Dialog欄選擇CDialo
8、g,Dialog ID欄選擇先前創(chuàng)建的新對話框源模板的標識符IDD_DIALOG_USER(如圖所示)。對話框類的建立界面 2利用類向?qū)砑訉υ捒蝾惖某蓡T變量 為了對編輯框輸入的數(shù)據(jù)進行控制,需要在對話框類中增加與這些控件有關(guān)的類的成員變量。 按Ctrl+W打開類向?qū)υ捒?,選擇MFC ClassWizard對話框中的Member Variable標簽,然后在Class Name欄中選擇對應(yīng)的CPassWordDlg對話框類,此時在下面該類的變量列表中會出現(xiàn)該對話框中的各控件的資源ID號。雙擊Controls IDs列表中的編輯框控件的資源ID號ID_EDIT_USERNAME,在Catego
9、ry欄中選擇Value(值變量)(還有一種控件型變量Control),在Value Type欄中選擇CString類型。這些操作的界面如圖所示。用用樣的方法再增加一個變量m_strPassword。利用對話框類CDialog操縱對話框(續(xù)) 按OK按鈕后,這兩個類的成員變量m_strUserName和m_strPassword就被加入到CPasswordDlg類的定義中,定位到該類的頭文件PassDlg.h中,找到如下的幾行代碼:class CPassWordDlg : public CDialog/ Constructionpublic:CPassWordDlg(CWnd* pParent
10、= NULL); / standard constructor/ Dialog Data/AFX_DATA(CPassWordDlg)enum IDD = IDD_DIALOG_USER ;CStringm_strPassword; /通過類向?qū)г黾拥淖址兞?,保存密碼CStringm_strUserName; /通過類向?qū)г黾拥淖址兞?,保存用戶名稱/AFX_DATA8.2.4初始化對話框 如何初始化各種類型的數(shù)據(jù)對象是很重要的,當處理像對話框這樣復(fù)雜對象時,由于它的初始化工作放在多個階段,所以需要注意次序問題。對話框的初始化工作可以在下面的三個階段進行:構(gòu)造函數(shù)、對WM_CREATE消
11、息的響應(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ù)中進行的,下面是構(gòu)造函數(shù)的實現(xiàn)代碼。CPassWordDlg:CPassWordDlg(CWnd* pParent /*=NULL*/): CDialog(CPassWordDlg:IDD,
12、pParent)/AFX_DATA_INIT(CPassWordDlg)m_strPassword = _T(); /成員變量初始化為空m_strUserName = _T();/AFX_DATA_INIT 可見在對話框的構(gòu)造函數(shù)中主要是對對話框的數(shù)據(jù)成員變量進行初始化。8.2.4初始化對話框(續(xù)) 2在WM_CREATE的消息映射函數(shù)中初始化 由于對話框也是窗口,它在窗口創(chuàng)建時會收到WM_CREATE消息,該消息的響應(yīng)函數(shù)是OnCreate()。這樣,就能在窗口創(chuàng)建中做一些初始化工作。盡管用戶可能在WM_CREATE消息處理函數(shù)中進行一些數(shù)據(jù)成員的初始化工作,但更通常的做法是在對話框中的所有
13、控件都建立起來之后,響應(yīng)消息WM_INITDIALOG時,對數(shù)據(jù)成員進行初始化。 3在WM_INITDIALOG的消息映射函數(shù)中初始化 在對話框創(chuàng)建時,會收到WM_INITDIALOG消息,該消息的響應(yīng)函數(shù)是OnInitDialog()。在得到了8.2.4初始化對話框(續(xù)) WM_INITDIALOG消息時,對話框處于一個特殊的狀態(tài),首先,當我們獲得該消息時,對話框框架已經(jīng)建立起來,對話框的窗口句柄已經(jīng)有效;其次,各個控件也建立起來并放在適當?shù)牡胤?;第三,對話框控件還沒有顯示出來。因此,一般在OnInitDialog()函數(shù)中作一些影響對話框外觀的初始化工作,如可以設(shè)置或優(yōu)化對話框中各個控件的
14、外觀、大小尺寸、位置及其它內(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程序的對話
15、框模板IDD_DIALOG_USER、對話框類CPassWordDlg,緊接著編寫調(diào)用對話框的代碼。由于密碼驗證是在應(yīng)用程序的主框架顯示之前進行,因此密碼驗證對話框的調(diào)用必須在應(yīng)用程序主框架顯示之前就完成,很顯然它不能在視圖類中靠和用戶交互進行。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 M
16、fcExam.h#include MainFrm.h#include MfcExamDoc.h#include MfcExamView.h#include “PassWordDlg.h” /需要使用用戶登陸對話框,必須包含它#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif(2)超載應(yīng)用程序類的虛函數(shù)InitInstance()BOOL CMfcExamApp:InitInstance()./以下為用戶添加的代碼CPassWordDlg dlg;/如果點擊“取消”按鈕if
17、(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)用程序的類型比較簡單,當程序運行后,就自動顯示一個對話框的界面。倘若我們程序的輸入界面就是它(例如Windows中的計算器程序),則對話框的調(diào)
18、用的代碼在向?qū)е幸呀?jīng)完成,我們沒有必要編寫,但必須知道在什么地方調(diào)用的。 3通過用戶交互對象菜單、工具欄調(diào)用 在基于文檔/視圖結(jié)構(gòu)的應(yīng)用程序中,由于對話框大部分用作用戶的輸入與輸出界面,因此對話框的調(diào)用應(yīng)該在視圖類中完成。這在前面和后面的章節(jié)都會出現(xiàn)(自己琢磨)。一般來說,對話框的調(diào)用在選擇菜單項、工具欄、加速鍵或按了鼠標鍵、鍵盤鍵等觸發(fā)。8.2.6對話框的消息處理 1對話框本身的消息 一般在一個對話框中有多個按鈕,其中只有一個按鈕是缺省按鈕。在缺省按鈕的四周有一個虛線矩形框,缺省按鈕的作用在于用戶不需要用鼠標單擊它,只需按回車鍵就等同于單擊它,這減輕了用戶的負擔。在應(yīng)用程序中,要想改變或設(shè)置
19、對話框中的缺省按鈕,只需要使用SendMessage()發(fā)送一個對話框的消息 DM_GETDEFID或DM_SETDEFID即可。 2窗口消息 由于對話框是窗口,所以WM_開始的Windows消息,在對話框中類中都可以處理,在ClassWizard窗口的MessageMaps選項頁的Messages列表框中顯示的就是對話框可以處理的消息,其中包含了很多窗口消息。8.2.6對話框的消息處理(續(xù)) 3控件通知消息 我們可以像對待框架窗口類和視圖類一樣,向?qū)υ捒蛑械呐缮愔袨閃M_消息增加消息映射,但卻不能對話框中控件的通知消息增加ON_COMMAND消息映射宏,因為控件的通知消息包含有不同的通知代
20、碼。控件的通知消息主要指一個對話框中所包含的控件自己可以接收到的消息。例如EN_CHANGE就是一個編輯框內(nèi)容改變的控件通知消息(Edit Notification Changed)。在Windows對話框應(yīng)用程序中,當要對其中的控件進行全面的控制時,就要通過類向?qū)υ捒蛑械目丶砑涌丶耐ㄖ⒂成洹?【例8-2】在前述程序的基礎(chǔ)上,通過發(fā)送消息DM_SETDEFID將密碼對話框中的缺省按鈕設(shè)置為“確定”,在WM_INITDIALOG的消息響應(yīng)函數(shù)中將“取消”按鈕的大小改變,同時處理“用戶名稱”編輯框的通知消息EN_CHANGE。步驟如下: (1)利用類向?qū)砑訉υ捒蝾怌PassWordD
21、lg對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(恭喜您找到
22、后門,不用輸入密碼就可進入系統(tǒng));m_strUserName=good;m_strPassword=good;UpdateData(false);SendMessage(WM_COMMAND, IDOK,BN_CLICKED); /向確定按鈕發(fā)送單擊消息BN_CLICKED8.3標準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)用戶與程序進行交互最基本的途徑,
23、但僅僅使用菜單來完成這種交互,往往并不方便,有時甚至是難以勝任的。其實,Windows操作系統(tǒng)的一個重要特性就是友好的用戶界面。對于編程人員,它也提供了各種控件來實現(xiàn)直觀、方便、快捷的交互。在上一節(jié)我們使用過對話框,在對話框中的靜態(tài)文本、圖像以及各種按鈕都是控件??丶–ontrol,也稱為控制框)是一種子窗口,應(yīng)用程序用它來與其它窗口一起完成簡單的輸入輸出操作。 作為一般窗口,控件具有許多通用窗口屬性,因此控件可以像操作窗口那樣使用ShowWindow()、MoveWindow()等窗口管理函數(shù)來顯示或隱藏控件、改變控件的位置和尺寸以及其它的操作。 8.3.1控件簡介(續(xù)) 控件創(chuàng)建方式有兩
24、種。 一種是在對話框模板中放置控件,當應(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ù)選框單選框組合框列表框列表視圖樹形視圖標簽8.3.2靜態(tài)控件 靜態(tài)控件在MFC中是靠CStatic類來管理的,它是一種單向交互的
25、控件,只能支持應(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類型的對象,通常可選用對話框模板編輯器自動提供的缺省標識符IDC_STATIC,此時靜態(tài)控件只是起到一種標識的作用。8.3.2靜態(tài)控件(續(xù)) 1常見屬性 在對話框的應(yīng)用程序中,想要查
26、看某類控件的屬性,先選中該類控件,然后按Alt和回車鍵,就會彈出控件的屬性設(shè)置對話框。下圖是靜態(tài)控件的屬性窗口。 圖8.6 靜態(tài)控件屬性設(shè)置窗口圖 8.3.2靜態(tài)控件(續(xù))2常用方法 靜態(tài)控件類CStatic的成員函數(shù)見下表。成員函數(shù)說明SetBitmap指定在靜態(tài)控件中要顯示的位圖GetBitmap獲取用SetBitmap設(shè)置的位圖的句柄SetIcon指定在靜態(tài)控件中要顯示的圖標資源GetIcon獲取用SetIcon設(shè)置的圖標的句柄8.3.2靜態(tài)控件(續(xù))3常用消息 由于靜態(tài)控件只用作輸出,而不用作輸入,因此一般不處理它的消息,但它也有一個BN_CLICKED的消息。要想處理該消息,該控件的
27、屬性必須選中屬性窗口Style選項頁下的Notify復(fù)選框,并且修改其默認的資源標識符IDC_STATIC為其它的值。 8.3.3 按鈕控件 按鈕控件是一個小的矩形窗口,它們可以被單獨或成組使用。典型的按鈕控件有下壓按鈕(push button)、單選按鈕(radio button)和復(fù)選框(check box),它們在外觀和使用上都有很大的差異,但在MFC中都是用一個類CButton來封裝的。下壓按鈕通常立即產(chǎn)生某個動作,執(zhí)行某個命令,因此又叫命令按鈕。單選按鈕的外形是一個圓圈,當它被選中時,就會出現(xiàn)一個小黑點。復(fù)選框為一個空心方框,當它被選中時,就會出現(xiàn)一個“”標記。通常復(fù)選框只有選中和未
28、選中兩種狀態(tài)。8.3.3按鈕控件(續(xù)) 1常見屬性 在對話框的應(yīng)用程序中,選中所添加的按鈕控件,然后按ALT和回車鍵盤,就會彈出按鈕控件的屬性設(shè)置對話框,如圖所示。8.3.3按鈕控件(續(xù)) 按鈕控件常見屬性有:Visible(可視性)、Caption(顯示在控件上的標簽文本)、Disableed(是否為不接收用戶輸入的禁止狀態(tài))、Group(控件不僅可以單獨使用,而且還可以幾個編成一組。該屬性用于指定同組控件中的第一個控件。在同組控件中用戶可以使用箭頭鍵在控件之間移動,它以Tab order為序,在該控件之后的所有該屬性值為False的控件將被視為同一組控件,直到遇上Group屬性為True的
29、控件為止)、Table stop(是否可以使用TAB鍵來定位到該控件)等。8.3.3按鈕控件(續(xù)) 2常用方法 按鈕控件的操作是通過CButton類的成員函數(shù)來操作,下表為按鈕類CButton的成員函數(shù)。成員函數(shù)說明GetState獲取按鈕控件的檢查狀態(tài)、高亮狀態(tài)和焦點狀態(tài)SetState設(shè)置按鈕控件的高亮狀態(tài)GetCheck獲取按鈕控件的檢查狀態(tài)SetCheck設(shè)置按鈕控件的檢查狀態(tài)GetButtonstyle獲取有關(guān)按鈕控件風(fēng)格的信息SetButtonstyle設(shè)置按鈕的風(fēng)格GetBitmap獲取由SetBitmap設(shè)置的位圖的句柄SetBitmap確定要在按鈕上顯示的位圖8.3.3按鈕控
30、件(續(xù)) 3常用消息 下表為常見的按鈕通知消息中附帶的通知代碼。 通知碼動作描述BN_CLICKED按鈕被單擊BN_PUSHED按鈕被按下BN_DISABLE按鈕不可用BN_SETFOCUS按鈕獲得鍵盤輸入焦點8.3.4編輯控件 編輯控件是一個讓用戶從鍵盤輸入并編輯文字的矩形窗口,用戶可以通過它方便地輸入各種文字、數(shù)字或者口令,也可使用它來編輯或修改簡單的文本文件。若用戶在編輯控件內(nèi)單擊鼠標,或者按Tab鍵,就可以選中一個編輯控制框,并賦予它輸入焦點。被選中后,編輯控制框中將顯示其文本和一個表明插入點的位置的閃爍的插入符,然后用戶就可以用鍵盤或者鼠標來輸入文本,移動插入點,或者選擇將移動或刪除
31、的文本。 1常見屬性 在對話框應(yīng)用程序中,選中所添加的編輯框控件,然后按ALT和回車鍵,就會彈出編輯框控件屬性設(shè)置對話框。 8.3.4編輯控件(續(xù))2常用方法 編輯框控件操作是通過CEdit類的成員函數(shù)來操作,表中為編輯框控件類CEdit的成員函數(shù)。成員函數(shù)說明GetSel獲取文本編輯框中當前選擇的起始字符和終止字符位置ReplaceSel用指定文本替換文本編輯框中的當前選擇SetSel選擇文本編輯框中的一個字符范圍GetModify確定文本編輯框中內(nèi)容是否已被修改SetModify設(shè)置或清除文本框控件的修改標志SetReadonly設(shè)置文本框控件的只讀狀態(tài)GetPasswordChar獲取用
32、戶輸入文本時在文本框控件內(nèi)顯示的口令字符GetRect獲取文本框控件的矩形LimitText限制用戶可輸入文本框控件的文本長度SetPasswordChar設(shè)置或刪除當用戶輸入文本時在文本框控件中顯示的口令字符Undo取消上一次文本框控件操作Clear清除文本框控件內(nèi)的當前選擇Copy將文本框控件中的當前選項以CF_TEXT格式拷貝到剪貼板中Paste將數(shù)據(jù)從剪貼板拷貝到文本框控件中的當前光標位置處GetLineCount獲取多行文本框控件的行數(shù)GetLine從文本框控件內(nèi)獲取一行文本3常用消息表中是常見的編輯框通知消息。通知消息用戶操作EN_CHANGE用戶已經(jīng)修改了編輯控制框中的文本,與E
33、N_UPDATE通知消息不同,這條消息在Windows刷新顯示器之后發(fā)送EN_HSCROLL用戶單擊了編輯控制框的水平滾動條,Windows在更新屏幕之前,先發(fā)送這條消息。EN_MAXTEXT當編輯控制框不具有ES_AUTOHSCROLL樣式,而要插入的字符數(shù)超出了編輯控制框的寬度時,或者編輯控制框不具有ES_AUTOVSCROLL樣式,而要插入的總行數(shù)超出了編輯控制框的高度時,都發(fā)送這條消息EN_SETFOCUS當文本編輯控制框接收輸入焦點時發(fā)送這條消息EN_UPDATE用戶已經(jīng)改變了編輯控制框中的文本,且Windows即將顯示新的文本。Windows在格式化了新的文本后,但在顯示之前發(fā)送這
34、條消息,以便應(yīng)用程序可以重新確定編輯控制框窗口的大小。EN_VSCROLL用戶單擊了編輯控制框的垂直滾動條,Windows在更新顯示屏幕之前,發(fā)送這條消息 4實例 【例8-3】一個演示靜態(tài)文本控件、按鈕控件和編輯框控件的程序。它能求數(shù)一和數(shù)二的最大公約數(shù)和最小公倍數(shù)。 (1)創(chuàng)建一個基于對話框的應(yīng)用程序GcdExam,向?qū)傻拿總€步驟都使用缺省的。 (2)在對話框資源IDD_GCDEXAM_DIALOG中添加控件如下圖所示??丶愋蛯傩灾祵?yīng)的成員變量靜態(tài)文本控件IDIDC_STATICCaption數(shù)一IDIDC_STATICCaption數(shù)二成組框IDIDC_STATICCaption操
35、作數(shù)IDIDC_STATICCaption操作結(jié)果編輯框控件IDIDC_EDIT1int m_nSource1IDIDC_EDIT2int m_nSource2IDIDC_EDIT3int m_nResult單選按鈕IDIDC_RADIO1Caption最大公約數(shù)IDIDC_RADIO2Caption最小公倍數(shù)按鈕控件IDIDOKCaption退出在對話框中,設(shè)置控件的屬性如下表所示例8-3 (續(xù)) (3)添加單選按鈕的消息映射 前面講的所有程序中的消息映射的添加都是通過ClassWizard來進行的,但有時想要處理的消息在類向?qū)е袥]有,或者需要對一些特殊的情況要處理(如本例子,想用一個消息響
36、應(yīng)函數(shù)OnGcd響應(yīng)多個ON_COMMAND消息)時,當有很多個命令的功能類似,可以設(shè)置它們的ID號為連續(xù)的,再在消息映射中處理。ClassWizard不支持這種功能,程序員必須手工在消息映射中添加這類映射項。對于本程序,我們希望單擊“最大公約數(shù)”或“最小公倍數(shù)”時,都執(zhí)行同一個消息映射函數(shù)OnGcd(UINT nID),然后在映射函數(shù)再做進一步的處理。手工添加消息映射函數(shù)的步驟為:對話框類CGcdExamDlg頭文件GcdExamDlg.h中添加消息映射函數(shù)原型說明。class CGcdExamDlg : public CDialogpublic:CGcdExamDlg(CWnd* pPar
37、ent = 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_MSGDECLARE_MESSAGE_MAP()
38、;在對話框類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_MAPEND_MESSAGE_MAP()在對話框類CGcdExamDlg的實現(xiàn)文件GcdExamDlg.cpp中實現(xiàn)消息映射函數(shù)。void CGcdExamDlg:On
39、Gcd(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整除的
40、話p+=r; /一直累加原較小者,直到累加結(jié)果能被原較大者整除m_nResult=p; /p為最大公約數(shù),放到變量m_nResult中顯示UpdateData(false); /將后臺更改的數(shù)據(jù)送到前臺加以顯示8.3.5列表框控件 列表框是一個放有用戶可以選擇的對象列表項的控制窗口,這些列表項一般是以字符串形式或圖形形式來給出。它與單選按鈕組或復(fù)選框組一樣,都可以讓用戶在其中選擇一個或多個項,但不同的是,列表框中項的數(shù)目是可靈活變化的,程序運行時可往列表框中添加或刪除某些項。并且當列表框中的數(shù)目較多,列表框不能一次全部顯示時,就可以提供滾動條來拓展顯示范圍。8.3.5列表框控件(續(xù)) 1常見屬
41、性 在對話框的應(yīng)用程序中,選中所添加的列表框控件,然后按鼠標右鍵彈出菜單,選擇“Properities”菜單項,就會彈出列表框控件的屬性設(shè)置對話框,如下圖所示。8.3.5列表框控件(續(xù))2常用方法 列表框控件的操作是通過CListBox類的成員函數(shù)來操作,下表為列表框控件類CListBox的成員函數(shù)。成員函數(shù)說明GetCount獲取列表框中字符串的數(shù)目GetItemDataPtr獲取一個指向列表框項的指針GetSel獲取一列表框項的選擇狀態(tài)SetColumnWidth設(shè)置一多列列表框的寬度GetCurSel獲取列表框中當前所選串的索引(從零開始)SetCurSel選擇一列表框串AddStrin
42、g在列表框中增加一個串DeleteString從列表框中刪除一個串InsertString在列表框中指定位置處插入一個串ResetContent清除列表框中所有列表項FindString在列表框中查找一個串SelectString查找并選擇單列表框中的一個列表框串8.3.5列表框控件(續(xù))3常用消息 列表框的操作,不僅可以調(diào)用CListBox類的成員函數(shù)來進行,還可以通過發(fā)送消息給列表框來進行。 (1)發(fā)送消息到列表框 當列表框創(chuàng)建出來之后,往往要添加、刪除、修改或檢查列表框中的項,列表框的項除了用字符串來指定外,還往往通過索引來確定。索引表明某項在列表框中排列的位置,它以0為基準,即列表框中
43、的第一項索引為0,第二項索引為1,依此類推。8.3.5列表框控件(續(xù))(2)列表框發(fā)出的通知消息 當列表框發(fā)生了某個事件,如用戶雙擊了列表框中的某一項,列表框就會向其所屬的主窗口發(fā)送一條通知消息。列表框的通知消息是以帶參數(shù)的WM_COMMAND消息的形式來發(fā)送的。8.3.5列表框控件(續(xù)) 這時WM_COMMAND的wParam參數(shù)的高位字就是通知代碼,低位字是列表框的資源標識符,lParam參數(shù)則是列表框的句柄。 常見的列表框通知消息有三條:LBN_SELCHANGE表示列表框中的選擇將要改變,LBN_DBLCLK 表示用戶雙擊了列表框中的某一項,LBN_SELCANCEL表示用戶取消了對列
44、表框中的某一項選擇。消息作用參數(shù)LB_ADDSTRING添加字符串到列表框中wparam=0,lParam=字符串地址LB_INSERTSTRING添加一個字符串到指定的位置處wparam=索引,lParam=字符串地址LB_DELETESTRING刪除指定的字符串wparam=索引,lParam=0LB_RESETCONTENT刪除列表框中的全部項wparam=0,lParam=0LB_SETCURSEL設(shè)置單選列表框中的當前選擇項wparam=項的索引,lParam=0LB_GETTEXT獲取指定項的字符串waram=指定項的索引,lParam=字符串地址,返回字符串長度LB_SELSEL
45、選擇多項列表框中的某個項waram=選擇標志,lParam=指定項的索引8.3.6組合框控件 一個組合框是一個列表框和編輯框控件或者靜態(tài)文本框控件的組合。控件的列表部分可以始終顯示,也可以當用戶單擊了下拉箭頭時才打開,當前選擇的內(nèi)容在靜態(tài)文本框或編輯框中顯示。另外,若組合框具有下拉列表風(fēng)格,用戶可以鍵入列表框中的某個選項的開始字符來選擇它。如果列表框的內(nèi)容是可見的,列表框?qū)验_頭內(nèi)容與用戶鍵入內(nèi)容相匹配的第一項高亮度顯示。8.3.6組合框控件(續(xù)) 1.常見屬性 在對話框的應(yīng)用程序中,選中所添加的組合框控件,然后按鼠標右鍵彈出菜單,選擇Properities菜單項,就會彈出組合框控件的屬性設(shè)置
46、對話框,如下圖所示。 8.3.6組合框控件(續(xù)) 2.常用方法 組合框控件的操作是通過CComboBox類的成員函數(shù)來操作,下表為組合框控件類CcomboBox常用的成員函數(shù)。 成員函數(shù)功能描述GetCount獲得組合框之列表框中選擇項數(shù)目GetCurSel獲得組合框之列表框中當前選擇項的下標GetDroppedState決定下拉組合框的列表框是否可見GetEditSel獲取組合框中的編輯控件中所選文本的開始和末尾字符位置GetLBText獲取組合框中的列表框中的字符串LimitText指定用戶所允許輸入編輯框控件的文本長度Paste將CF_TEXT格式數(shù)據(jù)從剪貼板復(fù)制到編輯框中光標的當前位置
47、SetCurSel在組合框之列表框中選擇一項SetEditSel在組合框之編輯框中選擇文字ShowDropDown顯示或隱藏組合框的列表項部分8.3.6組合框控件(續(xù)) 3.常用消息 列表框的操作,不僅可以調(diào)用CComboBox類的成員函數(shù)來進行,還可以通過發(fā)送消息給組合框來進行,因此,首先要熟悉可以發(fā)送到組合框中的消息有哪些。 8.3.6組合框控件(續(xù)) (1)發(fā)送消息到組合框 發(fā)給到組合框的消息大體分為兩類:一類是作用于組合框中的列表部分,另一類是作用于組合框中的編輯控件,它們分別與發(fā)送給列表框和編輯框控件的消息存在對應(yīng)關(guān)系。 作用于組合框中的列表框的消息有CB_ADDSTRING、CB_
48、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表示用戶當前的選擇發(fā)生了變化,CBN_CLOS
49、EUP表示下拉列表框的列表即將被關(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 中添加如上頁圖所示的幾種控件。
50、顯示圖片的Picture圖片控件、選擇汽車的列表框控件、選擇字體的組合框控件、顯示汽車注釋的靜態(tài)文本控件。 (4)增加位圖資源:用鼠標右鍵單擊ClassView選項卡的最頂端,在彈出出式菜單中選擇“Import”導(dǎo)入命令,將外部的一些汽車圖片載入應(yīng)用程序的資源中,共導(dǎo)入八張圖片,其資源的ID號從IDB_BITMAP1到IDB_BITMAP8。例8-4(續(xù)) (5)設(shè)置控件的屬性:控件的主要屬性設(shè)置與對應(yīng)的成員變量控件類型屬性值對應(yīng)成員變量/響應(yīng)函數(shù)靜態(tài)文本控件IDIDC_STATIC1CaptionVisual C+實用教程靜態(tài)圖片控件IDIDC_STATIC2TypeBitMapImageI
51、DB_BITMAP1列表框控件IDIDC_LIST1LBN_SELCHANGE的消息映射函數(shù)OnSelchangeList1組合框框控件IDIDC_COMBO1CComboBox m_ComboxFont(Control 控件型變量)CStringm_FontName(Value值型變量)data宋體、黑體、幼圓隸書、行楷CBN_CLOSEUP消息的響應(yīng)函數(shù)OnCloseupCombo1() 按鈕控件IDIDOKCaption退出 WM_INITDIALOG的消息映射函數(shù)代碼BOOL CStaticControlDlg:OnInitDialog() /主要進行列表框中可選項內(nèi)容的填寫CDial
52、og:OnInitDialog(); /向?qū)傻拇a/以下為手工添加的代碼/通過向列表框發(fā)送消息的方法來訪問列表框(向列表框中增加選項)SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)高爾夫);SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)標 致);SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)別 克);SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)寶 馬);/使用類型無關(guān)
53、的方法來訪問列表框CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LIST1);pListBox-AddString(奧 迪);pListBox-AddString(馬自達);pListBox-AddString(甲克蟲);pListBox-AddString(奔 馳);/設(shè)置列表框的初始位置為0pListBox-SetCurSel(0);/設(shè)置字體組合框的初始位置為0,通過控件變量的方式來訪問m_ComboxFont.SetCurSel(0); . 組合框控件CBN_CLOSEUP的消息響應(yīng)函數(shù)OnCloseupCombo1()void CStat
54、icControlDlg:OnCloseupCombo1() /在該函數(shù)中,實現(xiàn)字體的選擇/顯示汽車的描述文字 char *CarIntroduce8=高爾夫-德國名車,世界經(jīng)典兩相轎車,標致-法國名車,線條流暢,造型時尚,別克-美國名車,空間寬敞,視野開闊,寶馬-德國名車,動力充沛,操控靈活,奧 迪-德國名車,工藝精細,配置齊全,馬自達-日本名車,懸掛偏硬,轉(zhuǎn)向靈活,甲克蟲-德國名車,外型圓滑,提速很快,奔 馳-德國名車,造型流暢,充滿活力;UpdateData(true);/獲得靜態(tài)文本框控件IDC_STATIC1的窗口指針和設(shè)備環(huán)境 CStatic *pTxt=(CStatic *)Ge
55、tDlgItem(IDC_STATIC1); CDC *pDC=pTxt-GetDC(); /獲得靜態(tài)文本框控件IDC_STATIC1的客戶區(qū)域 CRect rc; pTxt-GetClientRect(&rc); /創(chuàng)建畫背景的畫刷,并用其填充背景 CBrush MyBrush; MyBrush.CreateSolidBrush(RGB(192,192,0); /建立實心畫刷 pDC-FillRect(&rc,&MyBrush); /設(shè)置文字的色彩并輸出文字 pDC-SetBkColor(RGB(0,255,0);/設(shè)置背景色 pDC-SetBkMode(TRANSPARENT); /設(shè)置顯
56、示模式為透明 pDC-SetTextColor(RGB(0,0,255);/設(shè)置文本顏色 CFont font; /創(chuàng)建字體 VERIFY(font.CreatePointFont(160,m_FontName,pDC); pDC-SelectObject(&font);/發(fā)送消息以得到列表框中的選擇序號 int nItem=SendDlgItemMessage(IDC_LIST1,LB_GETCURSEL,0,0); pDC-DrawText(CarIntroducenItem,&rc,DT_CENTER|DT_SINGLELINE|DT_VCENTER); /將顯示區(qū)域下移兩個單位,以出現(xiàn)
57、浮雕的效果 rc=rc.operator -(CSize(2,1); pDC-DrawText(CarIntroducenItem,&rc,DT_CENTER|DT_SINGLELINE|DT_VCENTER); pTxt-ReleaseDC(pDC); 列表框控件CBN_SELCHANGE的消息響應(yīng)函數(shù)OnSelchangeList1()在該函數(shù)中,實現(xiàn)汽車圖片的選擇并顯示:void CStaticControlDlg:OnSelchangeList1() /通過向?qū)υ捒蛑械目丶l(fā)消息拉取列表框中的選擇short bmpNo=SendDlgItemMessage(IDC_LIST1,LB_G
58、ETCURSEL,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: MyBi
59、tmap.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(); /將選擇的位圖送到圖片控件中顯示 OnClos
60、eupCombo1();/顯示汽車的描述文字8.3.7控件的類型無關(guān)訪問 面向?qū)ο蟪绦蛟O(shè)計觀點認為,在應(yīng)用程序中只要獲得了應(yīng)用程序中某對象的指針,就可以實現(xiàn)對該對象的全面控制,那么在對話框的應(yīng)用程序中,如何獲得其中的任何一個控件呢? 對話框中的控件可以使用MFC控件類的接口進行訪問,也可以創(chuàng)建控件對象并將其連接到對話框控件上來訪問。8.3.7控件的類型無關(guān)訪問(續(xù)) 1使用成員函數(shù)GetDlgItem獲取某個資源ID的指針 調(diào)用CWnd 的成員函數(shù)GetDlgItem 返回一個指向給定控件的臨時對象的指針,并將返回值類型制轉(zhuǎn)換成適當?shù)腃+控件類型。 2使用Class Wizard 建立Cont
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)外部市場環(huán)境分析案例
- 醫(yī)療項目部主要管理人員職責(zé)分析
- 農(nóng)業(yè)設(shè)施建設(shè)揚塵治理措施
- 人教版七年級語文教學(xué)計劃的挑戰(zhàn)與對策
- 電商平臺貨物運輸質(zhì)量管控措施
- 2024-2025學(xué)年小學(xué)科學(xué)教研組班級活動計劃
- 二年級班主任下學(xué)期學(xué)生能力提升計劃
- 創(chuàng)新型企業(yè)的營銷策略研究
- P2P網(wǎng)絡(luò)借貸的客戶體驗與服務(wù)優(yōu)化
- 員工留存與人才梯隊建設(shè)
- 【計算機應(yīng)用基礎(chǔ)試題】韓山師范大學(xué)2022年練習(xí)題匯總(附答案解析)
- 文件袋、檔案袋密封條模板
- 愛愛醫(yī)資源-生理學(xué)-122排卵、黃體形成與月經(jīng)周期
- 10t單梁起重機安裝方案
- 科技小巨人工程驗收培訓(xùn)
- 大班繪本教案《月亮冰激凌》
- 環(huán)境經(jīng)濟學(xué)課件:第十次課 環(huán)境污染與效率費效分析等
- 《水產(chǎn)動物營養(yǎng)與飼料學(xué)》課件第1課-蛋白質(zhì)營養(yǎng)
- 食堂人員配置、職責(zé)與管理方案
- 生產(chǎn)異常報告單(共2頁)
- 美軍后勤保障衛(wèi)勤保障
評論
0/150
提交評論