-
- 素材大。
- 880.5 KB
- 素材授權:
- 免費下載
- 素材格式:
- .ppt
- 素材上傳:
- chenrong
- 上傳時間:
- 2018-04-13
- 素材編號:
- 190743
- 素材類別:
- 課件PPT
-
素材預覽
這是mfc按鈕控件ppt,包括了對話框的使用,控件的創(chuàng)建和使用方法,作業(yè)1,常用控件,通用對話框和消息對話框,作業(yè)2等內容,歡迎點擊下載。
mfc按鈕控件ppt是由紅軟PPT免費下載網推薦的一款課件PPT類型的PowerPoint.
第5章對話框和常用控件
5.1 對話框的使用
5.2 控件的創(chuàng)建和使用方法
作業(yè)1
5.3 常用控件
5.4 通用對話框和消息對話框
作業(yè)2
5.1對話框的使用
5.1.1模式和無模式對話框
模式對話框
指當對話框被彈出,用戶必須在對話框中作出相應的操作,在退出對話框之前,對話框所在的應用程序不能繼續(xù)執(zhí)行。
無模式對話框
指當對話框被彈出后,一直保留在屏幕上,可繼續(xù)在對話框所在的應用程序中進行其它操作;需要使用對話框時,單擊對話框所在的區(qū)域即可激活。
在創(chuàng)建和退出對話框窗口時的方式不同:
創(chuàng)建時,模式對話框由系統(tǒng)自動分配內存空間,對話框退出時,對話框對象自動刪除。無模式對話框需要來指定內存,退出時還需刪除對話框對象。
退出時,兩種對話框所使用的終止函數(shù)不一樣。模式對話框通過調用CDialog:: EndDialog來終止,無模式對話框則是調用CWnd::DestroyWindow來終止。
函數(shù)CDiaolog::OnOK和CDiaolog::OnCancel是調用EndDialog的,因此無模式對話框必須用DestroyWindow來重載OnOK 和OnCancel兩個函數(shù)。
需要正確刪除表示對話框的對象。對模式對話框,在創(chuàng)建函數(shù)返回后即可刪除對象。無模式對話框不是同步的,在創(chuàng)建函數(shù)調用后立即返回,因而不知道何時刪除對象,但可以通過重載CWnd::PostNcDestroy函數(shù)并執(zhí)行清除操作。
5.1對話框的使用
5.1.2使用對話框編輯器
打開對話框編輯器
將項目工作區(qū)窗口切換到ResourceView頁面,雙擊Dialog目錄下任意一個對話框ID;蛘,選擇“Insert”“Resource”菜單命令(或按快捷鍵Ctrl+R),選擇Dialog項,單擊New。
5.1對話框的使用
在對話框中添加和編輯控件
(1)控件添加的方法
在對話框中添加一個控件的方法有下列幾種:
在控件工具欄中單擊某控件,鼠標箭頭在對話框內變成“十”字形狀;在對話框指定位置單擊鼠標左鍵,再拖動選擇框可改變控件的大小和位置。
在控件工具欄中單擊某控件,鼠標箭頭對話框內變成“十”字形狀;在指定位置處單擊鼠標左鍵不放,拖動鼠標至滿意位置,釋放鼠標鍵。
用鼠標左鍵點中控件工具欄中的某控件,并按住鼠標鍵不放;在移動鼠標到對話框的指定位置的過程中,會看到一個虛線框,下面帶有該控件的標記;釋放鼠標鍵。
5.1對話框的使用
(2)單個控件的選取
鼠標選取
保證選擇按鈕( )是被選中的,移動鼠標指針至指定的控件上,單擊鼠標左鍵。
助記符選取
在相應的控件上右擊。選擇“Properties”菜單項,對話框中的“Caption”框是用來輸入控件的標題,在標題中的某個字母之前鍵入“&”符號,則該字母就是此控件的助記符。
Tab鍵選取
利用Tab鍵,可在對話框內的控件中進行選擇。每按一次Tab鍵依次選取對話框中的下一個控件,若按住Shift鍵,再單擊Tab鍵則選取上一個控件。
(3)多個控件的選取
在對話框內按住鼠標左鍵不放,拖出一個大的虛框,釋放鼠標,則被該虛框所包圍的控件都將被選取。
先按住Shift鍵不放,用鼠標選取控件,直到所需要的多個控件選取之后再釋放Shift鍵。若在選取時,對已選取的控件再選取一下,則該控件取消選取。
一旦單個控件被選取后,其四周由選擇框包圍著,選擇框上還有幾個(通常是八個)藍色實心小方塊,拖動它可改變控件的大小,如圖。
多個控件被選取后,其中只有一個控件的選擇框有幾個藍色實心小方塊,這個控件稱為主要控件,而其他控件的選擇框的小方塊是空心的。如圖。
5.1對話框的使用
(4)控件的移動、刪除和復制
當單個控件或多個控件被選取后,按方向鍵或用鼠標拖動控件的選擇框可移動控件。若在鼠標拖動過程中還按住Ctrl鍵則復制控件。若按Del鍵可將選取的控件刪除。
(5)設定控件的Tab鍵次序
一是改變用Tab鍵選擇控件的次序,二是當兩個或兩個以上的控件構成一組時,需要它們的Tab鍵次序連續(xù)。
對話框內控件的Tab鍵次序設定步驟如下:
首先,選擇“Layout”“Tab Order”命令,或按Ctrl+D,此時每個控件的左上方都有一個數(shù)字,表明了當前Tab鍵次序,如圖。
其次,按新的次序依次用鼠標單擊各個控件,新的Tab鍵即可生成。
最后,單擊對話框或按Enter鍵結束Tab Order 方式。
5.1對話框的使用
對話框內的控件的布局
5.1對話框的使用
大多布置控件的命令使用前,需要選取多個控件,且“主要控件”起到了關鍵作用。多個控件的布置過程中,常需要重新設置“主要控件”。設置的方法是按住Ctrl或Shift鍵,用鼠標單擊所要指定的控件。
系統(tǒng)提供了網格、標尺等輔助工具。在圖5.5的控件布局工具欄的最后兩個按鈕分別用作網格和標尺的切換。一旦網格顯示,添加或移動控件時都將自動定位在網格線上。“Layout”菜單下的“Guide Settings”命令提供了設置網格單元大小的功能,如圖。
測試對話框
5.1對話框的使用
5.1.3對話框的編程
添加對話框資源
選擇“Insert”“Resource”菜單命令(或按Ctrl+R),若單擊Dialog項左邊的“+”號,將展開對話框資源的不同類型選項,如圖。
5.1對話框的使用
改變對話框的屬性
在對話框模板的非控件的區(qū)域內左擊,用下列方式之一打開屬性對話框:
選擇“View”菜單“Properties”命令或按Alt+Enter健(3種方法)。
用鼠標右擊對話框模板,選取Properties命令。
如圖,General是對話框屬性的默認顯示頁面,其中列有對話框的標識符名稱框、標題框等,具體說明如表。
5.1對話框的使用
向對話框內添加控件
添加一個類
在對話框模板的非控件的區(qū)域內雙擊,如圖的對話框。
單擊[OK],彈出如圖的對話框。可以為對話框資源定義一個新類名。
5.1對話框的使用
消息映射
單擊[OK]按鈕,出現(xiàn)“MFC ClassWizard”對話框,如圖。
5.1對話框的使用
選定IDC_BUTTON1的BN_CLICKED,雙擊左鍵或單擊[Add Function]按鈕,如圖。
對話框中,可以為添加的成員函數(shù)名重新定義,單擊[OK]。選定成員函數(shù)OnButton1項,雙擊左鍵或單擊[Edit Code]按鈕,在此成員函數(shù)添加代碼。
不同資源對象(控件、菜單命令等)的消息是不相同的。例如,按鈕控件IDC_BUTTON1的消息有兩個:BN_CLICKED和BN_DOUBLECLICKED,分別表示當用戶單擊或雙擊該按鈕時產生的消息。
一般不需要對圖5.10對話框中的[OK](確定)與[Cancel](取消)按鈕進行消息映射,因為系統(tǒng)已自動設置了這兩個按鈕的動作,當用戶單擊這兩個按鈕都將自動關閉對話框。
5.1對話框的使用
添加用戶代碼
(1)在頭文件(MyDlg.h文件)中聲明消息處理函數(shù)OnButton1:
protected:
//{{AFX_MSG(CMyDlg)
afx_msg void OnButton1();
//}}AFX_MSG
(2)在MyDlg.cpp源文件開頭部分的消息映射入口,添加消息映射宏:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) // 消息映射開始
//{{AFX_MSG_MAP(CMyDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() // 消息映射結束
表明消息及其處理函數(shù)之間的聯(lián)系。單擊按鈕控件IDC_BUTTON1時,系統(tǒng)將自動調用OnButton1函數(shù)。
(3)在MyDlg.cpp文件中寫入一個空的消息處理函數(shù)的模板,以便用戶填入具體代碼,如下面的框架:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
}
5.1對話框的使用
在程序中使用對話框
(1)利用項目工作區(qū)的ClassView標簽項,將Ex_SDIHello.cpp源文件打開;
(2)在Ex_SDIHello.cpp源文件的前面加上包含類CMyDlg的頭文件:
#include "MyDlg.h"
(3)在InitInstance函數(shù)體中的“return TRUE;”語句之前添加下列代碼:
CMyDlg dlg;
dlg.DoModal();
DoModal是模式對話框最常用的函數(shù),它負責對話框的顯示和終止。
(4)編譯并運行。在程序的一開始就出現(xiàn)用戶自己設計的對話框,單擊[Button1]按鈕將彈出“歡迎進入對話框的設計!”的消息對話框來。
5.2控件的創(chuàng)建和使用方法
5.2.1控件的創(chuàng)建方法
控件的創(chuàng)建方式有以下兩種:
一種是在對話框模板中用編輯器指定控件,也就是說,將控件的父窗口指定為對話框,這樣做的好處是明顯的,因為當應用程序啟動該對話框時,Windows系統(tǒng)就會為對話框創(chuàng)建控件;而當對話框消失時,控件也隨之清除。
另一種方式是將控件看作是任一窗口的子窗口,并通過調用相應的Create函數(shù)來創(chuàng)建。
[例Ex_SDIHello] 在上例Ex_SDIHello的基礎上用子窗口方式創(chuàng)建控件。
(1)打開CMyDlg的頭文件MyDlg.h,添加一個按鈕類CButton指針變量:
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
CButton *m_btnWnd;//動態(tài)創(chuàng)建
…
}
5.2控件的創(chuàng)建和使用方法
(2)按Ctrl+W快捷鍵打開對話框,切換到Message Maps頁面,在Object IDs列表中選定“CMyDlg”項,并在Message列表中找到WM_INITDIALOG消息,雙擊鼠標左鍵,然后單擊[Edit Code]按鈕,添加下列代碼:
BOOL CMyDlg::OnInitDialog()
{ CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_btnWnd = new CButton(); // 構造按鈕控件
m_btnWnd ->Create("你好", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,CRect(20, 20, 120, 60), this, 201); // 創(chuàng)建
CFont *font = this->GetFont(); // 獲取對話框的字體
m_btnWnd->SetFont(font); // 設置控件字體
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Create用來創(chuàng)建一個按鈕控件,第一個參數(shù)指定按鈕的標題,第二個參數(shù)指定控件的風格,第三個參數(shù)指定它在父窗口中的位置和大小,第四個參數(shù)指定父窗口指針,最后一個參數(shù)是指定該控件的標識值。
(3)編譯并運行,
5.2控件的創(chuàng)建和使用方法
5.2.2控件的數(shù)據(jù)交換和數(shù)據(jù)校驗
例如,為CMyDlg類的按鈕控件IDC_BUTTON1添加并使用其成員變量m_MyBtn,則其相應的過程如下:
(1)啟動MFC ClassWizard,切換到Member Variables頁面,如圖。
(2)選定Class name為CMyDlg,然后在Control IDs列表中,選定所要關聯(lián)的控件ID號IDC_BUTTON1,雙擊鼠標左鍵或單擊[Add Variable]按鈕,如圖。
5.2控件的創(chuàng)建和使用方法
(3)在Member variable name框中填好與控件相關聯(lián)的成員變量,單擊[OK],在Control IDs列表中出現(xiàn)剛才添加的內容。
需要說明的是,
DDV/DDX技術中,允許為同一個控件關聯(lián)多個數(shù)據(jù)成員變量,但必須保證這些變量名是互不相同的,且這些變量在同一個類型不能有多個變量。
如果添加的成員變量是一個數(shù)值類型,則在Mm_MyBtnFC ClassWizard對話框的Member Variables頁面下方還要求用戶輸入變量的范圍,這就是控件的數(shù)據(jù)校驗設置。
(4)單擊[OK],發(fā)現(xiàn)ClassWizard作了以下三方面的修改。
在MyDlg.h文件中,添加與控件關聯(lián)的成員變量的聲明,代碼如下:
// Dialog Data
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_DIALOG1 };
CButton m_MyBtn;//控件型變量,即CButton類的對象
CString m_strEdit;//字符串變量
//}}AFX_DATA
5.2控件的創(chuàng)建和使用方法
在MyDlg.cpp文件中的CMyDlg構造函數(shù)實現(xiàn)代碼處,添加數(shù)據(jù)成員變量的初始代碼:
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{ //{{AFX_DATA_INIT(CMyDlg)
m_strEdit = _T("");
//}}AFX_DATA_INIT
}
在MyDlg.cpp文件中的DoDataExchange函數(shù)體內,添加控件的DDX/DDV代碼。
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX); // 調用此函數(shù)作為DDX的開始
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_BUTTON1, m_MyBtn);
DDX_Text(pDX, IDC_EDIT1, m_strEdit);
DDV_MaxChars(pDX, m_strEdit, 20);
//}}AFX_DATA_MAP
}
5.2控件的創(chuàng)建和使用方法
(5)為一個控件定義一個關聯(lián)的數(shù)據(jù)成員變量后,就可以使用CWnd::UpdateData函數(shù)實現(xiàn)控件的控制,包括控件相關數(shù)據(jù)的輸入和讀取。在OnButton1()函數(shù)中添加如下代碼:
CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
GetDlgItemText(IDC_EDIT1,m_strEdit);
SetDlgItemText(IDC_BUTTON1,m_strEdit);
運行該程序,當在編輯框中輸入“Hello”后,單擊[Button1]按鈕,則此時該按鈕的名稱就變成了編輯框控件中的內容“Hello”,如圖。
5.2控件的創(chuàng)建和使用方法
5.2.3控件的通用屬性
5.2控件的創(chuàng)建和使用方法
5.2.4控件的消息
控件的編程和使用過程中,可以向控件發(fā)送消息來完成特定的任務,或者是根據(jù)控件產生的消息執(zhí)行自己的代碼。
應用程序創(chuàng)建一般控件或公共控件之后,控件的狀態(tài)發(fā)生改變時,控件就會向其父窗口發(fā)送消息,這個消息稱為“通知消息”。對于每個消息,系統(tǒng)都會用一個MSG結構來記錄,MSG具有下列結構:
typedef struct tagMSG { // msg
HWND hwnd; // 接收到消息的窗口句柄
UINT message; // 消息
WPARAM wParam; // 消息的附加信息,它的含義取決于message
LPARAM lParam; // 消息的附加信息,它的含義取決于message
DWORD time; // 消息傳送時的時間
POINT pt; // 消息傳送時,光標的屏幕坐標
} MSG;
對于一般控件來說,通知消息通常是一條WM_COMMAND消息,這條消息的wParam參數(shù)的低位字中含有控件標識符,wParam參數(shù)的高位字則為通知代碼,lParam參數(shù)則是指向控件的句柄。
5.2控件的創(chuàng)建和使用方法
對于公共控件,通知消息通常是一條WM_NOTIFY消息,wParam參數(shù)是發(fā)送通知消息的控件的標識符,lParam參數(shù)是指向NMHDR結構的指針。對于有些控件的通知消息,lParam參數(shù)是指向一個更大的結構,且結構中的第一個成員還必須具有NMHDR結構。
對于控件的WM_COMMAND或是WM_NOTIFY消息,都可以用ClassWizard對它們加以映射。
盡管控件的各自通知消息并不相同,但下列的通知消息是所有Windows控件所共有的:
NM_CLICK 在控件中單擊鼠標左按鈕
NM_DBLCLK 在控件中雙擊鼠標左按鈕
NM_RCLICK 在控件中單擊鼠標左按鈕
NM_RDBLCLK 在控件中雙擊鼠標右按鈕
NM_RETURN 當控件具有輸入焦點時按下ENTER鍵
NM_SETFOCUS 控件得到輸入焦點
NM_KILLFOCUS 控件失去輸入焦點
NM_OUTOFMEMORY 沒有足夠的內存使控件完成操作
5.3常用控件
根據(jù)控件的特性和功能,一般可將其分為三類:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。
5.3常用控件
5.3.1靜態(tài)控件和按鈕
靜態(tài)控件
一個靜態(tài)控件是用來顯示一個字符串、框、矩形、圖標、位圖或增強的圖元文件。它可以被用來作為標簽、框或用來分隔其它的控件。一個靜態(tài)控件一般不接收用戶輸入,也不產生通知消息。
在對話框編輯器的控件工具欄中,屬于靜態(tài)控件的有:靜態(tài)文本( )、組框( )和靜態(tài)圖片( )三種。
5.3常用控件
按鈕
(1)按鍵按鈕
通?梢粤⒓串a生某個動作,執(zhí)行某個命令,常被稱為命令按鈕。兩種風格:標準按鍵按鈕和默認按鍵按鈕。從外觀上來說,默認按鍵按鈕是在標準按鍵按鈕的周圍加上一個黑色邊框,這個黑色邊框表示該按鈕已接受到鍵盤的輸入焦點,只須按回車鍵就能按下該按鈕。具體設定的方法是在按鍵按鈕屬性對話框的Style頁面中選中“Default button”項。
(2)單選按鈕
外形是在文本前有一個圓圈,被選中時,就標上一個黑點,可分為一般和自動兩種類型。自動類型中,若選中同組按鈕中的某個單選按鈕,則其余的單選按鈕的選中狀態(tài)就會清除,保證了多個選項始終只有一個被選中。
(3)復選框
外形是在文本前有一個空心方框,被選中時,復選框中就加上一個“”標記,三態(tài)復選框還有種處于灰框狀態(tài),表示“不確定”。設定成三態(tài)復選框的方法是在復選框屬性對話框的Style頁面中選中“Tri-state”項。
5.3常用控件
按鈕的消息
常見的只有兩個:BN_CLICKED和BN_DOUBLE_CLICKED。
按鈕選中操作
最常用的按鈕操作是設置或獲取一個或多個按鈕的選中狀態(tài)。CButton類的成員函數(shù)SetCheck和GetCheck設置或獲取指定按鈕的選中狀態(tài),原型:
void SetCheck( int nCheck );
int GetCheck( ) const;
nCheck和GetCheck函數(shù)返回的值可以是:0表示不選中,1表示選中,2表示不確定(僅用于三態(tài)按鈕)。
對于多個單選按鈕的選中狀態(tài)的設置或獲取,需要使用CWnd類的成員函數(shù)CheckRadioButton和GetCheckedRadioButton,原型:
void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );
int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );
nIDFirstButton和nIDLastButton指定這組單選按鈕的第一個和最后一個按鈕ID值,nIDCheckButton指定要設置選中狀態(tài)的按鈕ID值,函數(shù)GetCheckedRadioButton返回被選中的按鈕ID值。
5.3常用控件
[例Ex_Ctrls1] 用靜態(tài)圖片、單選按鈕、復選框和按鍵按鈕控件,設計界面。開始,所有單選按鈕都是灰顯的,不能選擇,選中“允許”復選框后,所有單選按鈕可以使用,選定一個單選框后,單擊[應用]。
(1)用MFC AppWizard(exe)創(chuàng)建一個名為Ex_CommCtrls的基于對話框的應用程序。在創(chuàng)建的第一步,將應用程序類型選擇為Dialog Based,按[Finish]。自動顯示出該程序的對話框資源模板內容。
(2)打開屬性對話框將其標題改為“使用Windows常用控件”。
(3)用編輯器為對話框添加如下表所示的一些控件。
(4)四個單選按鈕的Tab次序應連續(xù),從IDC_RADIO1到IDC_RADIO4依次增加。
(5)按Ctrl+W快捷鍵,切換到Member Variables頁面,在Class name中選擇CEx_CommCtrlstDlg,選中復選框控件ID號IDC_CHECK1,雙擊鼠標或單擊Add Variables按鈕。
5.3常用控件
(6)切換到ClassWizard的Messsage Maps頁面,為復選框IDC_CHECK1和按鈕IDC_BUTTON1增加BN_CLICKED的消息映射,添加代碼:
void CEx_CommCtrlsDlg::OnCheck1()
{ UpdateData();
for (int i=0; i<4; i++)
GetDlgItem(IDC_RADIO1 + i)->EnableWindow(m_bEnabled);
}
void CEx_CommCtrlsDlg::OnButton1()
{ UpdateData();
if (!m_bEnabled) return;
int nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);
if (nID == IDC_RADIO1)
{ MessageBox("1"); }
if (nID == IDC_RADIO2)
{ MessageBox("2"); }
if (nID == IDC_RADIO3)
{ MessageBox("3"); }
if (nID == IDC_RADIO4)
{ MessageBox("4"); }
}
5.3常用控件
(7)定位到CEx_CommCtrlsDlg::OnInitDialog函數(shù)體中,添加下列代碼:
BOOL CEx_CommCtrlsDlg::OnInitDialog()
{ CDialog::OnInitDialog();
…
CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO1); //設置第一個單選按鈕為選中
OnCheck1();
return TRUE; // return TRUE unless you set the focus to a control
}
(8)編譯并運行。
5.3常用控件
5.3.2編輯框
編輯框的屬性和風格
5.3常用控件
編輯框的基本操作
(1)口令設置
默認的口令字符是“*”,應用程序可以用成員函數(shù)CEdit::SetPasswordChar 來定義自己的口令字符,其函數(shù)原型如下:
void SetPasswordChar( TCHAR ch );
(2)選擇文本
用鼠標來選擇文本的操作方法:在要選擇的文本的一端按下鼠標左鍵并拖動鼠標,到另一端釋放鼠標鍵。
用鍵盤來選擇文本的方法:在按光標方向移動鍵的同時,按住Shift鍵。
應用程序中可以通過編程選擇文本,需要通過調用成員函數(shù)CEdit::SetSel 來實現(xiàn)。與該函數(shù)相對應的還有CEdit::GetSel和CEdit::ReplaceSel,分別用來獲取編輯框中選擇的開始和結束的位置以及替換被選擇的文本。
(3)設置編輯框的頁面邊距
設置編輯框的頁面邊距可以使文本在編輯框顯示更具滿意效果,應用程序可通過調用成員函數(shù)CEdit::SetMargins來實現(xiàn),函數(shù)原型:
void SetMargins( UINT nLeft, UINT nRight );
(4)剪帖板操作
編輯框自動支持文本的復制、粘貼、剪切的鍵盤操作,對應的快捷健為Ctrl+C、Ctrl+V和Ctrl+X。若應用程序調用CEdit::Undo函數(shù)時,還可撤消當前的操作,再調用一次該函數(shù),則恢復剛才的操作。
5.3常用控件
(5)獲取多行編輯框文本
一種是使用DDX/DDV,將編輯框控件所關聯(lián)的變量類型選定為CString后,則不管多行編輯框的文本有多少都可用此變量來保存。這種方法不能單獨獲得多行編輯框中的某一行文本。
另一種方法是使用編輯框CEdit類的相關成員函數(shù)來獲取文本。例如,下面的代碼將顯示編輯框中第二行的文本內容:
char str[100];
if (m_Edit.GetLineCount()>=2) // 判斷多行編輯框的文本是否有兩行以上
{ int nChars;
nChars = m_Edit.LineLength(m_Edit.LineIndex(1)); // 獲取第二行文本的字符個數(shù)
// 0表示第一行,1表示第二行,依次類推。LineIndex用于將文本行轉換成
// 能被LineLength識別的索引
m_Edit.GetLine(1,str,nChars); // 獲取第二行文本
str[nChars] = '\0';
MessageBox(str);
}
5.3常用控件
編輯框的通知消息
[例Ex_Ctrls2] 使用靜態(tài)文本、組框、編輯框以及按鈕等控件,設計界面。用戶在“成績1”、“成績2”和“成績3”編輯框中輸入成績后,單擊[計算平均分]按鈕,將顯示出這三個成績的平均分。
(1)打開前面的Ex_CommCtrls。
(2)向應用程序中添加一個對話框資源,打開屬性對話框將其標題改為“使用編輯框”,ID號改為IDD_EDIT。
(3) 用編輯器為對話框添加如下表所示的一些控件。
(4)雙擊對話框模板或按Ctrl+W快捷鍵,為對話框資源IDD_EDIT創(chuàng)建一個對話框類CEditDlg。
5.3常用控件
(5)打開ClassWizard的Member Variables標簽,在Class name中選擇CEditDlg,選中所需的控件ID號,雙擊鼠標或單擊Add Variables按鈕。依次為控件增加成員變量。
(6)切換到ClassWizard的Messsage Maps標簽頁,為CEditDlg增加WM_INITDIALOG的消息映射,并添加下列代碼:
BOOL CEditDlg::OnInitDialog()
{ CDialog::OnInitDialog();
m_strAve = "0.00";
UpdateData(FALSE);// 將成員變量數(shù)據(jù)傳給控件,并在控件中顯示
return TRUE;
}
5.3常用控件
(7)用ClassWziard為按鈕IDC_BUTTON1添加BN_CLICKED的消息映射,并增加下列代碼:
void CEditDlg::OnButton1()
{ UpdateData(); // 將控件顯示的數(shù)據(jù)傳給成員變量
double ave = (double)(m_nScore1+m_nScore2+m_nScore3)/3.0;
m_strAve.Format("%6.2f", ave);
UpdateData(FALSE); // 將成員變量數(shù)據(jù)傳給控件并顯示
}
(8)定位到CEx_CommCtrlsDlg::OnButton1函數(shù)處,修改代碼如下:
if (nID == IDC_RADIO1) {
CEditDlg dlg;
dlg.DoModal();
}
(9)在Ex_CommCtrlsDlg.cpp文件的開始處,增加包含CEditDlg的頭文件。
#include “EditDlg.h”
(10)編譯運行并測試。
作業(yè)
1.P375:1,3,6,8,10
2.P412:實驗9
5.3常用控件
5.3.3列表框
列表框的風格
5.3常用控件
列表框的基本操作
(1)添加列表項
列表框創(chuàng)建時是一個空的列表,需要添加或插入一些列表項。CListBox類成員函數(shù)AddString 和InsertString用來向列表框增加列表項,原型:
int AddString( LPCTSTR lpszItem );
int InsertString( int nIndex, LPCTSTR lpszItem );
CListBox的SetItemData和SetItemDataPtr能使數(shù)據(jù)和某個列表項關聯(lián)起來。
int SetItemData( int nIndex, DWORD dwItemData );
int SetItemDataPtr( int nIndex, void* pData );
(2)刪除列表項
CListBox類成員函數(shù)DeleteString和ResetContent分別用來刪除指定的列表項和清除列表框所有項目。它們的函數(shù)原型如下:
int DeleteString( UINT nIndex ); // nIndex指定要刪除的列表項的索引
void ResetContent( );
若在添加列表項時使用SetItemDataPtr函數(shù),不要忘記在進行刪除操作時及時將關聯(lián)數(shù)據(jù)所占的內存空間釋放出來。
5.3常用控件
(3)查找列表項
CListBox類成員函數(shù)FindString 和FindStringExact分別用來在列表框中查找所匹配的列表項,其中FindStringExact的查找精度最高。
int FindString( int nStartAfter, LPCTSTR lpszItem ) const;
int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const;
lpszFind和lpszItem指定要查找的列表項文本,nStartAfter和nIndexStart指定查找的開始位置,若為-1,則從頭至尾查找。查到后,這兩個函數(shù)都將返回所匹配列表項的索引,否則返回LB_ERR。
(4)列表框的單項選擇
當選中列表框中某個列表項,可以使用CListBox::GetCurSel來獲取這個結果,與該函數(shù)相對應的CListBox::SetCurSel 函數(shù)是用來設定某個列表項呈選中狀態(tài)(高亮顯示)。
int GetCurSel( ) const; // 返回當前選擇項的索引
int SetCurSel( int nSelect );
nSelect指定要設置的列表項索引,錯誤時這兩個函數(shù)都將返回LB_ERR。
若要獲取某個列表項的字符串,可使用下列函數(shù):
int GetText( int nIndex, LPTSTR lpszBuffer ) const;
void GetText( int nIndex, CString& rString ) const;
nIndex指定列表項索引,lpszBuffer 和rString是用來存放列表項文本。
5.3常用控件
(5)列表框的多項選擇
在列表框的Style屬性對話框中選中多選(Multiple)或擴展多選(Extended)類型后,就可以在列表框中進行多項選擇。要想獲得選中的多個選項,通過需要用ClassWizrd映射LBN_SELCHANGE消息,添加類似代碼:
void CListBoxDlg::OnSelchangeList1()
{ int nCount = m_list.GetSelCount(); // 獲取用戶選中的項數(shù)
if (nCount != LB_ERR)
{ int *buffer = new int[nCount]; // 開辟緩沖區(qū)
m_list.GetSelItems(nCount,buffer);
CString allStr, str;
allStr.Empty(); // 字符串清空
for (int i=0; i<nCount; i++)
{ m_list.GetText(buffer[i], str);
allStr = allStr + “[” + str + “]”; }
delete []buffer; // 釋放內存
// MessageBox(allStr); // 處理獲得的文本
}
}
5.3常用控件
列表框的通知消息
[例Ex_Ctrls3] 將一個SCORE結構(含有三門成績的數(shù)據(jù)成員)數(shù)據(jù)和列表框中每一個學生姓名列表關聯(lián)起來。用戶單擊[添加記錄]按鈕時,學生成績記錄中的“姓名”被添加在列表框中,該學生的成績與該列表項關聯(lián)。單擊[刪除記錄]時,列表框中當前選擇項被刪除,相關聯(lián)的數(shù)據(jù)所占的內存空間被釋放。任何時候選中列表框中某個學生,相應的記錄數(shù)據(jù)都被顯示出來。
(1)打開前面創(chuàng)建的基于對話框應用程序程序項目Ex_CommCtrls。
(2)向應用程序中添加一個對話框資源IDD_LISTBOX,標題定為“使用列表框”,用ClassWizard為此對話框類定義為CListBoxDlg。
(3)刪除原來的Cancel按鈕,用編輯器為對話框添加如下表所示的控件。
5.3常用控件
(4)打開ClassWizard的Member Variables頁面,在Class name中選擇CListBoxDlg,選中所需的控件ID號,雙擊鼠標或單擊Add Variables按鈕。
(5)切換到ClassWizard的Messsage Maps標簽頁,為按鈕IDC_DATA_ADD添加BN_CLICKED的消息映射,增加代碼:
void CListBoxDlg::OnDataAdd()
{ UpdateData(TRUE);
if (m_strName.IsEmpty()) // 判斷m_strName是否為空
{ MessageBox("姓名不能為空!");
return; }
m_strName.TrimLeft(); // 裁剪m_strName左邊的空格
m_strName.TrimRight(); // 裁剪m_strName右邊的空格
if ((m_List.FindString(-1,m_strName)) != LB_ERR)
{ MessageBox("列表框中已有相同姓名,不能添加!");
return; }
int nIndex = m_List.AddString(m_strName); // 向列表框添加學生姓名
// 將該學生成績與新增的列表項關聯(lián)起來
SCORE data;
data.score1 = m_nScore1;
data.score2 = m_nScore2;
data.score3 = m_nScore3;
m_List.SetItemDataPtr(nIndex, new SCORE(data));
}
5.3常用控件
(6)用ClassWizard為按鈕IDC_DATA_DEL添加BN_CLICKED的消息映射,增加代碼:
void CListBoxDlg::OnDataDel()
{ int nIndex = m_List.GetCurSel(); // 獲得當前選擇項的索引
if (nIndex != LB_ERR)
{ m_List.DeleteString(nIndex); // 刪除當前選擇項
m_strName.Empty();
m_nScore1 = m_nScore2 = m_nScore3 = 0;
UpdateData(FALSE);
}
else MessageBox("當前沒有選擇項或列表框操作失敗!");
}
(7)用ClassWizard為按鈕IDC_LIST1添加LBN_SELCHANGE的消息映射,增加代碼:
void CListBoxDlg::OnSelchangeList1()
{ int nIndex = m_List.GetCurSel();
if (nIndex != LB_ERR)
{ m_List.GetText(nIndex, m_strName);
SCORE *data=(SCORE *)m_List.GetItemDataPtr(nIndex);
m_nScore1 = data->score1;
m_nScore2 = data->score2;
m_nScore3 = data->score3;
UpdateData(FALSE);
}
}
5.3常用控件
(8)用ClassWizard為對話框添加WM_DESTROY的消息映射,增加代碼:
void CListBoxDlg::OnDestroy() // 此消息是當對話框關閉時發(fā)送的
{ for (int nIndex = m_List.GetCount()-1; nIndex>=0; nIndex--)
{// 刪除所有與列表項相關聯(lián)的SCORE結構數(shù)據(jù),并釋放內存
delete (SCORE *)m_List.GetItemDataPtr(nIndex);
}
CDialog::OnDestroy(); // 關閉對話框
}
對話框被清除時發(fā)送WM_DESTROY消息。用戶在此消息的映射函數(shù)中添加一些對象刪除代碼,以便在對話框清除前有效地釋放內存空間。
5.3常用控件
(9)打開ListBoxDlg.h源文件,在類CListBoxDlg定義的public處添加下列代碼:
public:
struct SCORE
{ int score1;
int score2;
int score3;
};
(10) 定位到CEx_CommCtrlsDlg::OnButton1函數(shù)處,修改代碼如下:
if (nID == IDC_RADIO2)
{ CListBoxDlg dlg;
dlg.DoModal();
}
(11)在Ex_CommCtrlsDlg.cpp文件的開始處,增加包含CListBoxDlg的頭文件。
#include “ListBoxDlg.h”
(12) 編譯運行并測試。
5.3常用控件
5.3.4組合框
組合框的風格及類型
5.3常用控件
組合框常見操作
組合框的操作大致分為兩類,一類是對組合框中的列表框進行操作,另一類是對組合框中的編輯框進行操作。這些操作都可以調用CComboBox成員函數(shù)來實現(xiàn)。
組合框的通知消息
繪圖時還需要下列一些技巧:
需要更新或重新繪制窗口的外觀時,應用程序就會發(fā)送WM_PAINT消息。用ClassWizard在對話框中映射WM_PAINT消息的目的是執(zhí)行繪圖代碼。
防止用系統(tǒng)默認的顏色向對話框進行重復繪制,須調用UpdateWindow函數(shù)。UpdateWindow是CWnd的無參數(shù)的成員函數(shù),目的是繞過系統(tǒng)的消息列隊,直接發(fā)送或停止發(fā)送WM_PAINT消息。窗口沒有需要更新的區(qū)域時,就停止發(fā)送。繪制完圖形時,沒有WM_PAINT消息的發(fā)送,系統(tǒng)不會用默認的顏色對窗口進行重復繪制。
如果對話框中的任何部分變?yōu)闊o效時,對話框的OnPaint函數(shù)都會自動調用?梢酝ㄟ^調用Invalidate函數(shù)來通知系統(tǒng)此時的窗口狀態(tài)已變?yōu)闊o效,強制系統(tǒng)調用WM_PAINT消息函數(shù)OnPaint重新繪制。
5.3常用控件
[例Ex_Ctrls4] 根據(jù)用戶從組合框中選擇的填充樣式,在對話框中繪制一個矩形區(qū)域,如圖。
(1)打開前面創(chuàng)建的基于對話框應用程序程序項目Ex_CommCtrls。
(2)向應用程序中添加一個對話框資源IDD_COMBO,標題定為“使用組合框”,用ClassWizard為此對話框類定義為CComboDlg。
(3) 刪除原來的Cancel按鈕,用編輯器為對話框添加控件。
5.3常用控件
(4)打開ClassWizard的Member Variables標簽,為組合框IDC_PATTERN增加成員變量m_Pattern,其類型為Control類的CComboBox 。
(5)為CComboDlg類添加一個int類型的成員變量m_nDrawPattern。
(6)切換到ClassWizard的Messsage Maps標簽頁,為組合框IDC_PATTERN添加CBN_SELCHANGE(組合框中的當前選項發(fā)生改變)的消息映射,并增加下列代碼:
void CComboDlg::OnSelchangePattern()
{ int nIndex = m_Pattern.GetCurSel();// 獲得當前選項的索引
if (nIndex != CB_ERR)
{ m_nDrawPattern = m_Pattern.GetItemData(nIndex);
// 獲得與當前選項相關聯(lián)的數(shù)據(jù)
Invalidate(); // 強制系統(tǒng)調用OnPaint函數(shù)重新繪制
}
}
5.3常用控件
(7)用ClassWizard為對話框添加WM_PAINT的消息映射,并增加下列代碼:
void CComboDlg::OnPaint()
{ CPaintDC dc(this); // device context for painting(繪圖所必須的設備環(huán)境)
CWnd* pWnd = GetDlgItem(IDC_DRAW);// 獲得控件IDC_DRAW的窗口指針
pWnd->UpdateWindow(); // 避免系統(tǒng)自動重繪
CDC* pDC = pWnd->GetDC(); // 獲得所需要的繪圖設備環(huán)境
CBrush drawBrush; // 定義一個畫刷
drawBrush.CreateHatchBrush(m_nDrawPattern,RGB(0,0,0));// 創(chuàng)建畫刷
CBrush* pOldBrush = pDC->SelectObject(&drawBrush);
// 將畫刷選入當前設備環(huán)境中
CRect rcClient; // 定義一個CRect變量
pWnd->GetClientRect(rcClient); // 獲得窗口客戶區(qū)大小
pDC->Rectangle(rcClient); // 用當前畫刷繪制一個矩形區(qū)域
pDC->SelectObject(pOldBrush); // 恢復設備環(huán)境原來的畫刷設置
}
5.3常用控件
(8)用ClassWizard為對話框添加WM_INITDIALOG的消息映射,增加代碼:
BOOL CComboDlg::OnInitDialog()
{ CDialog::OnInitDialog();
CString str[6] = {"水平線","豎直線","向下斜線","向上斜線","十字線","交叉線"};
int nIndex;
for (int i=0; i<6; i++)
{
nIndex = m_Pattern.AddString(str[i]);
m_Pattern.SetItemData(nIndex,i);
}
m_Pattern.SetCurSel(0);
m_nDrawPattern = 0;
return TRUE;
}
5.3常用控件
(9)定位到CEx_CommCtrlsDlg::OnButton1函數(shù)處,修改代碼如下:
if (nID == IDC_RADIO3)
{
CComboDlg dlg;
dlg.DoModal();
}
(10)在Ex_CommCtrlsDlg.cpp文件的開始處,增加包含CComboDlg的頭文件。
#include “ComboDlg.h”
(11)編譯運行并測試。
5.3常用控件
5.3.5滾動條和進展條
滾動條
(1)滾動條的基本操作
在MFC的CScrollBar類中,函數(shù)SetScrollRange是用來設置滾動條的滾動范圍的,其原型如下:
SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );
在CScrollBar類中,設置滾動塊位置操作是由SetScrollPos函數(shù)來完成的,其原型如下:
int SetScrollPos( int nPos, BOOL bRedraw = TRUE );
與SetScrollRange 和SetScrollPos相對應的兩個函數(shù)是分別用來獲取滾動條的當前范圍以及當前滾動位置:
void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) ;
int GetScrollPos();
需要說明的是:在CScrollBar類的成員函數(shù)中,還可以用SetScrollInfo和GetScrollInfo來代替上面提到的四個函數(shù)。與前面的函數(shù)相比,使用SetScrollInfo函數(shù)還能使?jié)L動塊的大小隨內容的多少而改變。
5.3常用控件
(2) WM_HSCROLL或WM_VSCROLL消息
滾動條進行操作時,會向父窗口發(fā)送WM_HSCROLL或WM_VSCROLL消息。通過ClassWziard在其對話框中進行映射,產生相應的消息映射函數(shù)OnHScroll和OnVScroll,函數(shù)原型:
afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
5.3常用控件
進展條
(1)進展條的風格
打開進展條的屬性對話框。Border指定進展條是否有邊框,Vertical指定進展是水平還是垂直的。Smooth表示平滑地填充進展條。
(2)進展條的基本操作
基本操作:設置范圍、當前位置、增量等。通過相關的CProgressCtrl類成員函數(shù)實現(xiàn)。
int SetPos( int nPos );
int GetPos();
這兩個函數(shù)分別用來設置和獲取進展條的當前位置。
void SetRange( short nLower, short nUpper );
void SetRange32(int nLower, int nUpper );
void GetRange( int & nLower, int& nUpper );
分別用來設置和獲取進展條范圍的上限和下限值。
int SetStep( int nStep );
該函數(shù)用來設置進展條的步長并返回原來的步長。
int StepIt();
該函數(shù)將當前位置向前移動一個步長并重畫進展條以反映新的位置。
5.3常用控件
5.3.6旋轉按鈕控件和滑動條
旋轉按鈕控件
(1)旋轉按鈕控件常用的風格
5.3常用控件
(2)旋轉按鈕控件的基本操作
成員函數(shù)SetBase是用來設置其基數(shù)的,函數(shù)的原型如下:
int SetBase( int nBase );
成員函數(shù)SetPos和SetRange設置旋轉按鈕控件的當前位置和范圍,它們的函數(shù)原型如下:
int SetPos( int nPos );
void SetRange( int nLower, int nUpper );
成員函數(shù)SetAccel和GetAccel用來設置和獲取旋轉按鈕控件的加速度。其中函數(shù)SetAccel的原型如下:
BOOL SetAccel( int nAccel, UDACCEL* pAccel );
參數(shù)nAccel表示由pAccel指定的UDACCEL結構的數(shù)目。pAccel指向一個UDACCEL結構數(shù)組的指針,該數(shù)組包含了加速信息,其結構如下:
typedef struct {
UINT nSec; // 位置改變前所等待的秒數(shù)。
UINT nInc; // 位置增量。
}UDACCEL, FAR *LPUDACCEL;
(3)旋轉按鈕控件的通知消息
旋轉按鈕控件的通知消息只有一個:UDN_DELTAPOS,它是當控件的當前數(shù)值將要改變時向其父窗口發(fā)送的。
5.3常用控件
滑動條
(1)滑動條的風格
5.3常用控件
(2)滑動條的基本操作
成員函數(shù)SetPos和SetRange用來設置滑動條的位置和范圍,原型如下:
void SetPos( int nPos );
void SetRange( int nMin, int nMax, BOOL bRedraw = FALSE );
成員函數(shù)SetTic用來設置滑動條控件中的一個刻度線的位置。函數(shù)成功調用后返回非零值;否則返回0。函數(shù)原型如下:
BOOL SetTic( int nTic );
成員函數(shù)SetTicFreq設置顯示在滑動條中的刻度線的疏密程度。原型如下:
void SetTicFreq( int nFreq );
成員函數(shù)ClearTics用來從滑動條控件中刪除當前的刻度線。函數(shù)原型如下:
void ClearTics( BOOL bRedraw = FALSE );
成員函數(shù)SetSelection用來設置一個滑動條控件中當前選擇的開始和結束位置。其函數(shù)原型如下:
void SetSelection( int nMin, int nMax );
(3)滑動條的通知消息
消息代碼都來自于WM_HSCROLL或WM_VSCROLL消息。
5.3常用控件
[例Ex_Ctrls5]用滾動條、滑動條和旋轉按鈕控件分別來調整RGB的三個顏色分量,根據(jù)指定的顏色填充一個矩形區(qū)域。
(1)打開前面創(chuàng)建的基于對話框應用程序程序項目Ex_CommCtrls。
(2)向應用程序中添加一個對話框資源IDD_SCROLL,標題定為“使用滾動條、旋轉按鈕控件和滑動條”,用ClassWizard為此對話框類定義為CScrollDlg。
(3)刪除原來的Cancel按鈕,用編輯器為對話框添加如下表所示的一些控件。
5.3常用控件
(4)打開ClassWizard的Member Variables標簽,在Class name中選擇CScrollDlg,選中所需的控件ID號,雙擊鼠標或單擊Add Variables按鈕。依次為下列控件增加成員變量。
(5)切換到ClassWizard的Messsage Maps標簽頁,為編輯框IDC_EDIT1、IDC_EDIT2和IDC_EDIT3添加EN_CHANGE的消息映射,使用它們的消息處理函數(shù)名都設為OnChangeEdit,并增加下列代碼:
void CScrollDlg::OnChangeEdit()
{ if (!m_bEditOK) return;
UpdateData();
m_Scroll.SetScrollPos(m_RValue);
m_Slider.SetPos(m_GValue);
Draw();
}
5.3常用控件
(6)用ClassWizard為對話框添加WM_PAINT的消息映射,增加代碼:
void CScrollDlg::OnPaint()
{ CPaintDC dc(this); // device context for painting
CWnd* pWnd=GetDlgItem(IDC_DRAW);
pWnd->UpdateWindow();
Draw();
}
(7)用ClassWizard為對話框添加WM_INITDIALOG的消息映射,增加代碼:
BOOL CScrollDlg::OnInitDialog()
{ CDialog::OnInitDialog();
// 設置滾動條和滑動條的范圍和當前位置
m_Scroll.SetScrollRange(0,255);
m_Scroll.SetScrollPos(m_RValue);
m_Slider.SetRange(0,255);
m_Slider.SetPos(m_GValue);
// 設置旋轉按鈕的范圍
m_Spin.SetRange(0,255);
UpdateData(FALSE); // 將數(shù)據(jù)傳給控件
m_bEditOK = TRUE;
return TRUE;
}
5.3常用控件
(8)用ClassWizard為對話框添加WM_HSCROLL的消息映射,增加代碼:
void CScrollDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{ int nID = pScrollBar->GetDlgCtrlID();
if (nID == IDC_SLIDER1) // 是滑動條產生水平滾動消息
{ m_GValue = m_Slider.GetPos();// 獲得滑動條當前的位置 }
if (nID == IDC_SCROLLBAR1) // 是滾動條產生水平滾動消息
{ switch(nSBCode)
{ case SB_LINELEFT:m_RValue--; break;
case SB_LINERIGHT:m_RValue++; break;
case SB_PAGELEFT: m_RValue -= 10; break;
case SB_PAGERIGHT:m_RValue += 10; break;
case SB_THUMBTRACK:m_RValue = nPos;break;
}
if (m_RValue<0) m_RValue = 0;
if (m_RValue>255) m_RValue = 255;
m_Scroll.SetScrollPos(m_RValue);
}
UpdateData(FALSE);
Draw();
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
5.3常用控件
(9)將項目工作區(qū)切換到ClassView頁面,用鼠標右擊“CScrollDlg”項,在彈出的快捷菜單中選中“Add Member Function”,將要增加的函數(shù)名設為Draw,函數(shù)類型為void,并添加下列代碼:
void CScrollDlg::Draw()
{ CWnd* pWnd = GetDlgItem(IDC_DRAW);
CDC* pDC = pWnd->GetDC(); // 獲得窗口當前的設備環(huán)境指針
CBrush drawBrush; // 定義畫刷變量
drawBrush.CreateSolidBrush(RGB(m_RValue,m_GValue,m_BValue));
// 創(chuàng)建一個填充色畫刷。
// 顏色分量轉換成一個32位的RGB顏色值
CBrush* pOldBrush = pDC->SelectObject(&drawBrush);
CRect rcClient;
pWnd->GetClientRect(rcClient);
pDC->Rectangle(rcClient);
pDC->SelectObject(pOldBrush);
}
5.3常用控件
(10)為CScrollDlg類添加一個BOOL型成員變量m_bEditOK,并在其構造函數(shù)中將其初值設為FALSE。
(11)定位到CEx_CommCtrlsDlg::OnButton1函數(shù)處,修改代碼如下:
if (nID == IDC_RADIO4)
{ CScrollDlg dlg;
dlg.DoModal();
}
(12)在Ex_CommCtrlsDlg.cpp文件的開始處,增加包含CScrollDlg的頭文件。
#include “ScrollDlg.h”
(13)編譯運行并測試。
在同時使用編輯框和旋轉按鈕控件時,有時會出現(xiàn)運行錯誤。為了解決這個問題,本例使用一個辦法,即使用一個BOOL型成員變量m_bEditOK作為控制條件,使得所有初始化代碼(包括設置旋轉控件范圍)執(zhí)行后,才允許編輯框工作。
由于滾動條和滑動條等許多控件都能產生WM_HSCROLL或WM_VSCROLL消息,因此當它們是處在同一方向(水平或垂直)時,就需要添加相應代碼判斷消息是誰產生的。
由于滾動條中間的滾動塊在默認時是不會停止在用戶操作的位置處的,因此需要調用SetScrollPos函數(shù)來進行相應位置的設定。
5.3常用控件
5.3.7圖像列表和標簽控件
圖像列表控件
(1)圖像列表的創(chuàng)建
由于Create函數(shù)的重載很多,故這里給出最常用的一個原型:
BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
(2)圖像列表的基本操作
常見的圖像列表的基本操作有:增加、刪除和繪制等,成員函數(shù):
int Add( CBitmap* pbmImage, CBitmap* pbmMask );
int Add( CBitmap* pbmImage, COLORREF crMask );
int Add( HICON hIcon );
BOOL Remove( int nImage );
該函數(shù)用來從圖像列表中刪除一個由nImage指定的圖像,
BOOL Draw( CDC* pdc, int nImage, POINT pt, UINT nStyle );
該函數(shù)用來在由pt指定的位置處繪制一個圖像。
HICON ExtractIcon( int nImage );
該函數(shù)用來將nImage指定的圖像擴展為圖標。
COLORREF SetBkColor( COLORREF cr );
該函數(shù)用來設置圖像列表的背景色,
5.3常用控件
標簽控件
(1)標簽控件的風格
5.3常用控件
(2)標簽控件的基本操作
GetItemRect是用來獲取標簽的邊界大小,原型如下:
CSize SetItemSize( CSize size );
void SetPadding( CSize size );//設置標簽和標簽周圍的間隔
int SetMinTabWidth( int cx );
BOOL GetItemRect( int nItem, LPRECT lpRect ) const;
成員函數(shù)InsertItem、DeleteItem表示在一個標簽控件中插入、刪除某一標簽項,DeleteAllItems刪除所有的項。原型如下:
BOOL InsertItem( int nItem, LPCTSTR lpszItem );
BOOL InsertItem( int nItem, LPCTSTR lpszItem, int nImage);
BOOL DeleteItem( int nItem );
BOOL DeleteAllItems( );
標簽控件中使用圖像列表時,必須調用CTabCtrl::SetImageList函數(shù)來指定一個已創(chuàng)建的圖像列表。函數(shù)原型如下:
CImageList * SetImageList( CImageList * pImageList );
成員函數(shù)SetCurSel和GetCurSel用來設置和獲取當前選擇的標簽項,原型如下:
int SetCurSel( int nItem );
int GetCurSel( ) const;
成員函數(shù)DeselectAll用來重新設置一個標簽控件中的項,清除任何被按下的項,函數(shù)HighlightItem是使某一個標簽項處于高亮狀態(tài)。原型如下:
void DeselectAll( BOOL fExcludeFocus );
BOOL HighlightItem( int idItem, BOOL fHighlight = TRUE );
(3)標簽控件的通知消息
5.3常用控件
[例Ex_Ctrls6] 使用無模式對話框來構造某個標簽頁面,一開始將所有的標簽頁面創(chuàng)建好,然后根據(jù)所選擇的當前標簽選項決定哪個頁面需要顯示,哪個頁面需要隱藏和禁用。
(1)用MFC AppWizard(exe)創(chuàng)建一個基于對話框的應用程序項目Ex_TabCtrl。
(2)打開屬性對話框將對話框標題改為“使用標簽控件”。
(3) 添加一個默認標簽控件IDC_TAB1,調整其大小和布局。
(4)按Ctrl+W,打開ClassWizard對話框,切換到Member Variables頁面,在Class name中選擇CEx_TabCtrlDlg,選中標簽控件ID號IDC_TAB1,雙擊鼠標或單擊Add Variables按鈕,為其添加一個CTabCtrl類型的成員變量m_Tab。
(5)添加三個對話框資源IDD_DIALOG1、IDD_DIALOG2和IDD_DIALOG3,并用ClassWizard依次為此三個對話框類定義為CTab1Dlg、CTab2Dlg和CTab3Dlg。
5.3常用控件
(6)將上述三個對話框的屬性設為Child Style和None Border(其他默認),且將對話框盡量縮小,如圖。
5.3常用控件
(7) 為三個對話框添加如下表所示的一些控件。
5.3常用控件
(8)在ClassView中的CEx_TabCtrlDlg類名處右擊鼠鍵,從彈出的快捷菜單中選擇Add Member Variables,添加下列數(shù)據(jù)成員:
public:
CTab1Dlg *m_pTab1Dlg;
CTab2Dlg *m_pTab2Dlg;
CTab3Dlg *m_pTab3Dlg;
CImageList m_ImageList;
(9)打開Ex_TabCtrlDlg.h文件,在class CEx_TabCtrlDlg前添加下列頭文件:
#include "Tab1Dlg.h"
#include "Tab2Dlg.h"
#include "Tab3Dlg.h"
5.3常用控件
(10)在ClassView中的CEx_TabCtrlDlg類名處右擊鼠鍵,選擇Add Member Function,添加成員函數(shù)SetDlgState和DoTab,并增加下列代碼:
void CEx_TabCtrlDlg::SetDlgState(CWnd *pWnd, BOOL bShow)
{ pWnd->EnableWindow(bShow);
if (bShow)
{ pWnd->ShowWindow(SW_SHOW);
pWnd->CenterWindow(); // 居中顯示
}
else pWnd->ShowWindow(SW_HIDE);
}
void CEx_TabCtrlDlg::DoTab(int nTab)
{ if (nTab>2) nTab = 2; // 確定nTab值不能超過范圍
if (nTab<0) nTab = 0;
BOOL bTab[3];
bTab[0] = bTab[1] = bTab[2] = FALSE;
bTab[nTab] = TRUE;
// 切換對話框的顯示和隱藏
SetDlgState(m_pTab1Dlg, bTab[0]);
SetDlgState(m_pTab2Dlg, bTab[1]);
SetDlgState(m_pTab3Dlg, bTab[2]);
}
5.3常用控件
(11)用ClassWizard為IDC_TAB1映射TCN_SELCHANGE消息,添加代碼:
void CEx_TabCtrlDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{ int nSelect = m_Tab.GetCurSel();
if (nSelect >= 0)
DoTab(nSelect);
*pResult = 0;
}
(12)按下Ctrl+R快捷鍵,單擊Import按鈕,從外部磁盤中調入三個圖標文件,并取默認的圖標ID號IDI_ICON1、IDI_ICON2和IDI_ICON3。
5.3常用控件
(13)在CEx_TabCtrlDlg::OnInitDialog中添加下列代碼:
BOOL CEx_TabCtrlDlg::OnInitDialog()
{ CDialog::OnInitDialog();
……
m_pTab1Dlg = new CTab1Dlg(); // 為無模式對話框分配空間
m_pTab2Dlg = new CTab2Dlg();
m_pTab3Dlg = new CTab3Dlg();
m_pTab1Dlg->Create(IDD_DIALOG1,&m_Tab);
m_pTab2Dlg->Create(IDD_DIALOG2,&m_Tab);
m_pTab3Dlg->Create(IDD_DIALOG3,&m_Tab);
m_ImageList.Create(16, 16, ILC_COLOR|ILC_MASK, 3, 0); // 創(chuàng)建圖像列表
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_Tab.SetImageList(&m_ImageList); // 設置TAB控件所使用的圖像列表
m_Tab.InsertItem(0, "基本信息", 0);
m_Tab.InsertItem(1, "成績", 1);
m_Tab.InsertItem(2, "備注", 2);
m_Tab.SetMinTabWidth(80); // 設置標簽項的最小寬度
m_Tab.SetPadding(CSize(12,3)); // 設置標簽項和圖標周圍的間隔
m_Tab.SetCurSel(0);
DoTab(0);
return TRUE; }
5.3常用控件
(14)用ClassWizard為CEx_TabCtrlDlg類添加WM_DESTROY的消息映射,CEx_TabCtrlDlg對話框退出時,刪除分配給無模式對話框的內存。代碼:
void CEx_TabCtrlDlg::OnDestroy()
{ CDialog::OnDestroy();
if (m_pTab1Dlg) delete m_pTab1Dlg;
if (m_pTab2Dlg) delete m_pTab2Dlg;
if (m_pTab3Dlg) delete m_pTab3Dlg;
}
(15)用ClassWizard為CTab1lDlg類添加WM_INITDIALOG消息的映射,增加下列代碼:
BOOL CTab1Dlg::OnInitDialog()
{ CDialog::OnInitDialog();
CheckRadioButton(IDC_RADIO_MAN_1,IDC_RADIO_WOMAN_1,IDC_RADIO_MAN_1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
(16) 編譯并運行。
5.3常用控件
需要說明的是:
標簽頁面的切換可能還不止一種方法。例如,可以先將各個頁面的控件與標簽控件一起事先全部地添加到對話框模板中,然后再根據(jù)標簽控件的當前選項確定控件的顯示和隱藏,從而達到切換的效果。
在標簽頁面控件操作過程中,當按Enter鍵或Esc鍵,該頁面的對話框就會退出,標簽頁面變成了一個空白,影響交互效果。解決這個問題的一個辦法是在各頁面的對話框中屏蔽掉Enter鍵和Esc鍵的按鍵消息,它是通過添加PreTranslateMessage函數(shù)的重載來實現(xiàn)的,如下面的代碼:
BOOL CTab1Dlg::PreTranslateMessage(MSG* pMsg)
{ if (pMsg->message == WM_KEYDOWN)
{ if (pMsg->wParam == VK_RETURN) return TRUE; if (pMsg->wParam == VK_ESCAPE) return TRUE; }
return CDialog::PreTranslateMessage(pMsg);
}
5.4通用對話框和消息對話框
5.4.1通用對話框
Windows提供了一組標準用戶界面對話框,它們都有相應的MFC庫中的類來支持。所有這些通用對話框類都是從一個公共的基類CCommonDialog派生而來。表列出了這些通用對話框。
5.4通用對話框和消息對話框
5.4.2消息對話框
是最簡單的一類對話框,只是用來顯示信息的。MFC類庫中提供相應的函數(shù)實現(xiàn)這樣的功能,只要在程序任何地方調用它們。函數(shù)原型:
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );
作業(yè)
1.P375:12
2.P420:實驗10mfc教程ppt:這是mfc教程ppt,包括了數(shù)據(jù)庫編程,MFC ODBC數(shù)據(jù)庫概述,MFC ODBC編程,MFC ODBC向導過程,ODBC應用編程等內容,歡迎點擊下載。
mfc編程ppt:這是mfc編程ppt,包括了MFC ODBC數(shù)據(jù)庫概述,MFC ODBC編程,MFC ODBC向導過程,ODBC應用編程等內容,歡迎點擊下載。