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