版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第5章對話框和常用控件,5.1 對話框的使用 5.2 控件的創(chuàng)建和使用方法 作業(yè)1 5.3 常用控件 5.4 通用對話框和消息對話框 作業(yè)2,5.1對話框的使用,5.1.1模式和無模式對話框 模式對話框 指當(dāng)對話框被彈出,用戶必須在對話框中作出相應(yīng)的操作,在退出對話框之前,對話框所在的應(yīng)用程序不能繼續(xù)執(zhí)行。 無模式對話框 指當(dāng)對話框被彈出后,一直保留在屏幕上,可繼續(xù)在對話框所在的應(yīng)用程序中進(jìn)行其它操作;需要使用對話框時,單擊對話框所在的區(qū)域即可激活。 在創(chuàng)建和退出對話框窗口時的方式不同: 創(chuàng)建時,模式對話框由系統(tǒng)自動分配內(nèi)存空間,對話框退出時,對話框?qū)ο笞詣觿h除。無模式對話框需要來指定內(nèi)存,退
2、出時還需刪除對話框?qū)ο蟆?退出時,兩種對話框所使用的終止函數(shù)不一樣。模式對話框通過調(diào)用CDialog: EndDialog來終止,無模式對話框則是調(diào)用CWnd:DestroyWindow來終止。 函數(shù)CDiaolog:OnOK和CDiaolog:OnCancel是調(diào)用EndDialog的,因此無模式對話框必須用DestroyWindow來重載OnOK 和OnCancel兩個函數(shù)。 需要正確刪除表示對話框的對象。對模式對話框,在創(chuàng)建函數(shù)返回后即可刪除對象。無模式對話框不是同步的,在創(chuàng)建函數(shù)調(diào)用后立即返回,因而不知道何時刪除對象,但可以通過重載CWnd:PostNcDestroy函數(shù)并執(zhí)行清除操作
3、。,5.1對話框的使用,5.1.2使用對話框編輯器 打開對話框編輯器 將項(xiàng)目工作區(qū)窗口切換到ResourceView頁面,雙擊Dialog目錄下任意一個對話框ID?;蛘?,選擇“Insert”“Resource”菜單命令(或按快捷鍵Ctrl+R),選擇Dialog項(xiàng),單擊New。,5.1對話框的使用,在對話框中添加和編輯控件 (1)控件添加的方法 在對話框中添加一個控件的方法有下列幾種: 在控件工具欄中單擊某控件,鼠標(biāo)箭頭在對話框內(nèi)變成“十”字形狀;在對話框指定位置單擊鼠標(biāo)左鍵,再拖動選擇框可改變控件的大小和位置。 在控件工具欄中單擊某控件,鼠標(biāo)箭頭對話框內(nèi)變成“十”字形狀;在指定位置處單擊鼠標(biāo)
4、左鍵不放,拖動鼠標(biāo)至滿意位置,釋放鼠標(biāo)鍵。 用鼠標(biāo)左鍵點(diǎn)中控件工具欄中的某控件,并按住鼠標(biāo)鍵不放;在移動鼠標(biāo)到對話框的指定位置的過程中,會看到一個虛線框,下面帶有該控件的標(biāo)記;釋放鼠標(biāo)鍵。,5.1對話框的使用,(2)單個控件的選取 鼠標(biāo)選取 保證選擇按鈕( )是被選中的,移動鼠標(biāo)指針至指定的控件上,單擊鼠標(biāo)左鍵。 助記符選取 在相應(yīng)的控件上右擊。選擇“Properties”菜單項(xiàng),對話框中的“Caption”框是用來輸入控件的標(biāo)題,在標(biāo)題中的某個字母之前鍵入“ /AFX_MSG (2)在MyDlg.cpp源文件開頭部分的消息映射入口,添加消息映射宏: BEGIN_MESSAGE_MAP(CMy
5、Dlg, CDialog)/ 消息映射開始 /AFX_MSG_MAP(CMyDlg) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) /AFX_MSG_MAP END_MESSAGE_MAP()/ 消息映射結(jié)束 表明消息及其處理函數(shù)之間的聯(lián)系。單擊按鈕控件IDC_BUTTON1時,系統(tǒng)將自動調(diào)用OnButton1函數(shù)。 (3)在MyDlg.cpp文件中寫入一個空的消息處理函數(shù)的模板,以便用戶填入具體代碼,如下面的框架: void CMyDlg:OnButton1() / TODO: Add your control notification handler code
6、 here ,5.1對話框的使用,在程序中使用對話框 (1)利用項(xiàng)目工作區(qū)的ClassView標(biāo)簽項(xiàng),將Ex_SDIHello.cpp源文件打開; (2)在Ex_SDIHello.cpp源文件的前面加上包含類CMyDlg的頭文件: #include MyDlg.h (3)在InitInstance函數(shù)體中的“return TRUE;”語句之前添加下列代碼: CMyDlg dlg; dlg.DoModal(); DoModal是模式對話框最常用的函數(shù),它負(fù)責(zé)對話框的顯示和終止。 (4)編譯并運(yùn)行。在程序的一開始就出現(xiàn)用戶自己設(shè)計的對話框,單擊Button1按鈕將彈出“歡迎進(jìn)入對話框的設(shè)計!”的消
7、息對話框來。,5.2控件的創(chuàng)建和使用方法,5.2.1控件的創(chuàng)建方法 控件的創(chuàng)建方式有以下兩種: 一種是在對話框模板中用編輯器指定控件,也就是說,將控件的父窗口指定為對話框,這樣做的好處是明顯的,因?yàn)楫?dāng)應(yīng)用程序啟動該對話框時,Windows系統(tǒng)就會為對話框創(chuàng)建控件;而當(dāng)對話框消失時,控件也隨之清除。 另一種方式是將控件看作是任一窗口的子窗口,并通過調(diào)用相應(yīng)的Create函數(shù)來創(chuàng)建。 例Ex_SDIHello 在上例Ex_SDIHello的基礎(chǔ)上用子窗口方式創(chuàng)建控件。 (1)打開CMyDlg的頭文件MyDlg.h,添加一個按鈕類CButton指針變量: class CMyDlg : public
8、CDialog / Construction public: CMyDlg(CWnd* pParent = NULL); / standard constructor CButton *m_btnWnd; ,5.2控件的創(chuàng)建和使用方法,(2)按Ctrl+W快捷鍵打開對話框,切換到Message Maps頁面,在Object IDs列表中選定“CMyDlg”項(xiàng),并在Message列表中找到WM_INITDIALOG消息,雙擊鼠標(biāo)左鍵,然后單擊Edit Code按鈕,添加下列代碼: BOOL CMyDlg:OnInitDialog() CDialog:OnInitDialog(); / TODO:
9、 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();/ 獲取對話框的字體 m_btnWnd-SetFont(font);/ 設(shè)置控件字體 return TRUE; / return TRUE unless you set the focus to a contr
10、ol / EXCEPTION: OCX Property Pages should return FALSE Create用來創(chuàng)建一個按鈕控件,第一個參數(shù)指定按鈕的標(biāo)題,第二個參數(shù)指定控件的風(fēng)格,第三個參數(shù)指定它在父窗口中的位置和大小,第四個參數(shù)指定父窗口指針,最后一個參數(shù)是指定該控件的標(biāo)識值。 (3)編譯并運(yùn)行,,5.2控件的創(chuàng)建和使用方法,5.2.2控件的數(shù)據(jù)交換和數(shù)據(jù)校驗(yàn) 例如,為CMyDlg類的按鈕控件IDC_BUTTON1添加并使用其成員變量m_MyBtn,則其相應(yīng)的過程如下: (1)啟動MFC ClassWizard,切換到Member Variables頁面,如圖。 (2)選定C
11、lass name為CMyDlg,然后在Control IDs列表中,選定所要關(guān)聯(lián)的控件ID號IDC_BUTTON1,雙擊鼠標(biāo)左鍵或單擊Add Variable按鈕,如圖。,圖5.16 ClassWziard的“Member Variables”頁面,圖5.17 “Add Member Variable”對話框,5.2控件的創(chuàng)建和使用方法,(3)在Member variable name框中填好與控件相關(guān)聯(lián)的成員變量m_MyBtn,單擊OK,在Control IDs列表中出現(xiàn)剛才添加的內(nèi)容。 需要說明的是, DDV/DDX技術(shù)中,允許為同一個控件關(guān)聯(lián)多個數(shù)據(jù)成員變量,但必須保證這些變量名是互不
12、相同的,且這些變量在同一個類型不能有多個變量。 如果添加的成員變量是一個數(shù)值類型,則在MFC ClassWizard對話框的Member Variables頁面下方還要求用戶輸入變量的范圍,這就是控件的數(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 ; CButtonm_MyBtn; CStringm_strEdit; /AFX_DATA,5.2控件的創(chuàng)建和使用方法,在MyDlg.cp
13、p文件中的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的開
14、始 /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)為一個控件定義一個關(guān)聯(lián)的數(shù)據(jù)成員變量后,就可以使用CWnd:UpdateData函數(shù)實(shí)現(xiàn)控件的控制,包括控件相關(guān)數(shù)據(jù)的輸入和讀取。 運(yùn)行該程序,當(dāng)在編輯框中輸入“Hello”后,單擊Button1按鈕,則此時該按鈕的名稱就變成了編輯框控件中的內(nèi)容“Hello”,如圖
15、。,圖5.19 使用控件的數(shù)據(jù)成員變量,5.2控件的創(chuàng)建和使用方法,5.2.3控件的通用屬性,圖5.20 按鈕控件的屬性對話框,5.2控件的創(chuàng)建和使用方法,5.2.4控件的消息 控件的編程和使用過程中,可以向控件發(fā)送消息來完成特定的任務(wù),或者是根據(jù)控件產(chǎn)生的消息執(zhí)行自己的代碼。 應(yīng)用程序創(chuàng)建一般控件或公共控件之后,控件的狀態(tài)發(fā)生改變時,控件就會向其父窗口發(fā)送消息,這個消息稱為“通知消息”。對于每個消息,系統(tǒng)都會用一個MSG結(jié)構(gòu)來記錄,MSG具有下列結(jié)構(gòu): typedef struct tagMSG / msg HWND hwnd; / 接收到消息的窗口句柄 UINT message;/ 消息
16、WPARAM wParam; / 消息的附加信息,它的含義取決于message LPARAM lParam;/ 消息的附加信息,它的含義取決于message DWORD time;/ 消息傳送時的時間 POINT pt;/ 消息傳送時,光標(biāo)的屏幕坐標(biāo) MSG; 對于一般控件來說,通知消息通常是一條WM_COMMAND消息,這條消息的wParam參數(shù)的低位字中含有控件標(biāo)識符,wParam參數(shù)的高位字則為通知代碼,lParam參數(shù)則是指向控件的句柄。,5.2控件的創(chuàng)建和使用方法,對于公共控件,通知消息通常是一條WM_NOTIFY消息,wParam參數(shù)是發(fā)送通知消息的控件的標(biāo)識符,lParam參數(shù)是
17、指向NMHDR結(jié)構(gòu)的指針。對于有些控件的通知消息,lParam參數(shù)是指向一個更大的結(jié)構(gòu),且結(jié)構(gòu)中的第一個成員還必須具有NMHDR結(jié)構(gòu)。 對于控件的WM_COMMAND或是WM_NOTIFY消息,都可以用ClassWizard對它們加以映射。 盡管控件的各自通知消息并不相同,但下列的通知消息是所有Windows控件所共有的: NM_CLICK 在控件中單擊鼠標(biāo)左按鈕 NM_DBLCLK 在控件中雙擊鼠標(biāo)左按鈕 NM_RCLICK 在控件中單擊鼠標(biāo)左按鈕 NM_RDBLCLK 在控件中雙擊鼠標(biāo)右按鈕 NM_RETURN 當(dāng)控件具有輸入焦點(diǎn)時按下ENTER鍵 NM_SETFOCUS 控件得到輸入焦點(diǎn)
18、 NM_KILLFOCUS 控件失去輸入焦點(diǎn) NM_OUTOFMEMORY 沒有足夠的內(nèi)存使控件完成操作,5.3常用控件,根據(jù)控件的特性和功能,一般可將其分為三類:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。,5.3常用控件,5.3.1靜態(tài)控件和按鈕 靜態(tài)控件 一個靜態(tài)控件是用來顯示一個字符串、框、矩形、圖標(biāo)、位圖或增強(qiáng)的圖元文件。它可以被用來作為標(biāo)簽、框或用來分隔其它的控件。一個靜態(tài)控件一般不接收用戶輸入,也不產(chǎn)生通知消息。 在對話框編輯器的控件工具欄中,屬于靜態(tài)控件的有:靜態(tài)文本( )、組框( )和靜態(tài)圖片( )三種。,圖5.21 靜態(tài)圖片控件的General和S
19、tyle屬性對話框,5.3常用控件,按鈕 (1)按鍵按鈕 通??梢粤⒓串a(chǎn)生某個動作,執(zhí)行某個命令,常被稱為命令按鈕。兩種風(fēng)格:標(biāo)準(zhǔn)按鍵按鈕和默認(rèn)按鍵按鈕。從外觀上來說,默認(rèn)按鍵按鈕是在標(biāo)準(zhǔn)按鍵按鈕的周圍加上一個黑色邊框,這個黑色邊框表示該按鈕已接受到鍵盤的輸入焦點(diǎn),只須按回車鍵就能按下該按鈕。具體設(shè)定的方法是在按鍵按鈕屬性對話框的Style頁面中選中“Default button”項(xiàng)。 (2)單選按鈕 外形是在文本前有一個圓圈,被選中時,就標(biāo)上一個黑點(diǎn),可分為一般和自動兩種類型。自動類型中,若選中同組按鈕中的某個單選按鈕,則其余的單選按鈕的選中狀態(tài)就會清除,保證了多個選項(xiàng)始終只有一個被選中。
20、(3)復(fù)選框 外形是在文本前有一個空心方框,被選中時,復(fù)選框中就加上一個“”標(biāo)記,三態(tài)復(fù)選框還有種處于灰框狀態(tài),表示“不確定”。設(shè)定成三態(tài)復(fù)選框的方法是在復(fù)選框?qū)傩詫υ捒虻腟tyle頁面中選中“Tri-state”項(xiàng)。,5.3常用控件,按鈕的消息 常見的只有兩個:BN_CLICKED和BN_DOUBLE- CLICKED。 按鈕選中操作 最常用的按鈕操作是設(shè)置或獲取一個或多個按鈕的選中狀態(tài)。CButton類的成員函數(shù)SetCheck和GetCheck設(shè)置或獲取指定按鈕的選中狀態(tài),原型: void SetCheck( int nCheck ); int GetCheck( ) const; nC
21、heck和GetCheck函數(shù)返回的值可以是:0表示不選中,1表示選中,2表示不確定(僅用于三態(tài)按鈕)。 對于多個單選按鈕的選中狀態(tài)的設(shè)置或獲取,需要使用CWnd類的成員函數(shù)CheckRadioButton和GetCheckedRadioButton,原型: void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton ); int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton ); nIDFirstButton和nID
22、LastButton指定這組單選按鈕的第一個和最后一個按鈕ID值,nIDCheckButton指定要設(shè)置選中狀態(tài)的按鈕ID值,函數(shù)GetCheckedRadioButton返回被選中的按鈕ID值。,5.3常用控件,例Ex_Ctrls1 用靜態(tài)圖片、單選按鈕、復(fù)選框和按鍵按鈕控件,設(shè)計界面。開始,所有單選按鈕都是灰顯的,不能選擇,選中“允許”復(fù)選框后,所有單選按鈕可以使用,選定一個單選框后,單擊應(yīng)用。 (1)用MFC AppWizard(exe)創(chuàng)建一個名為Ex_CommCtrls的基于對話框的應(yīng)用程序。在創(chuàng)建的第一步,將應(yīng)用程序類型選擇為Dialog Based,按Finish。自動顯示出該程
23、序的對話框資源模板內(nèi)容。 (2)打開屬性對話框?qū)⑵錁?biāo)題改為“使用Windows常用控件”。 (3)用編輯器為對話框添加如下表所示的一些控件。 (4)四個單選按鈕的Tab次序應(yīng)連續(xù),從IDC_RADIO1到IDC_RADIO4依次增加。 (5)按Ctrl+W快捷鍵,切換到Member Variables頁面,在Class name中選擇CEx_CommCtrlstDlg,選中復(fù)選框控件ID號IDC_CHECK1,雙擊鼠標(biāo)或單擊Add Variables按鈕。,5.3常用控件,(6)切換到ClassWizard的Messsage Maps頁面,為復(fù)選框IDC_CHECK1和按鈕IDC_BUTTON
24、1增加BN_CLICKED的消息映射,添加代碼: void CEx_CommCtrlsDlg:OnCheck1() UpdateData(); for (int i=0; iEnableWindow(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
25、) 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è)置第一個單選按鈕為選中 OnCheck1(); return TRUE
26、; / return TRUE unless you set the focus to a control (8)編譯并運(yùn)行。,圖5.23 按鈕示例運(yùn)行結(jié)果,5.3常用控件,5.3.2編輯框 編輯框的屬性和風(fēng)格,圖5.24 編輯框的屬性對話框,5.3常用控件,編輯框的基本操作 (1)口令設(shè)置 默認(rèn)的口令字符是“*”,應(yīng)用程序可以用成員函數(shù)CEdit:SetPasswordChar 來定義自己的口令字符,其函數(shù)原型如下: void SetPasswordChar( TCHAR ch ); (2)選擇文本 用鼠標(biāo)來選擇文本的操作方法:在要選擇的文本的一端按下鼠標(biāo)左鍵并拖動鼠標(biāo),到另一端釋放鼠標(biāo)鍵。
27、 用鍵盤來選擇文本的方法:在按光標(biāo)方向移動鍵的同時,按住Shift鍵。 應(yīng)用程序中可以通過編程選擇文本,需要通過調(diào)用成員函數(shù)CEdit:SetSel 來實(shí)現(xiàn)。與該函數(shù)相對應(yīng)的還有CEdit:GetSel和CEdit:ReplaceSel,分別用來獲取編輯框中前選擇的開始和結(jié)束的位置以及替換被選擇的文本。 (3)設(shè)置編輯框的頁面邊距 設(shè)置編輯框的頁面邊距可以使文本在編輯框顯示更具滿意效果,應(yīng)用程序可通過調(diào)用成員函數(shù)CEdit:SetMargins來實(shí)現(xiàn),函數(shù)原型: void SetMargins( UINT nLeft, UINT nRight ); (4)剪帖板操作 編輯框自動支持文本的復(fù)制、
28、粘貼、剪切的鍵盤操作,對應(yīng)的快捷健為Ctrl+C、Ctrl+V和Ctrl+X。若應(yīng)用程序調(diào)用CEdit:Undo函數(shù)時,還可撤消當(dāng)前的操作,再調(diào)用一次該函數(shù),則恢復(fù)剛才的操作。,5.3常用控件,(5)獲取多行編輯框文本 一種是使用DDX/DDV,將編輯框控件所關(guān)聯(lián)的變量類型選定為CString后,則不管多行編輯框的文本有多少都可用此變量來保存。這種方法不能單獨(dú)獲得多行編輯框中的某一行文本。 另一種方法是使用編輯框CEdit類的相關(guān)成員函數(shù)來獲取文本。例如,下面的代碼將顯示編輯框中第二行的文本內(nèi)容: char str100; if (m_Edit.GetLineCount()=2)/ 判斷多行編
29、輯框的文本是否有兩行以上 int nChars; nChars = m_Edit.LineLength(m_Edit.LineIndex(1);/ 獲取第二行文本的字符個數(shù) / 0表示第一行,1表示第二行,依次類推。LineIndex用于將文本行轉(zhuǎn)換成 / 能被LineLength識別的索引 m_Edit.GetLine(1,str,nChars);/ 獲取第二行文本 strnChars = 0; MessageBox(str); ,5.3常用控件,編輯框的通知消息 例Ex_Ctrls2 使用靜態(tài)文本、組框、編輯框以及按鈕等控件,設(shè)計界面。用戶在“成績1”、“成績2”和“成績3”編輯框中輸入成
30、績后,單擊計算平均分按鈕,將顯示出這三個成績的平均分。 (1)打開前面的Ex_CommCtrls。 (2)向應(yīng)用程序中添加一個對話框資源,打開屬性對話框?qū)⑵錁?biāo)題改為“使用編輯框”,ID號改為IDD_EDIT。 (3) 用編輯器為對話框添加如下表所示的一些控件。 (4)雙擊對話框模板或按Ctrl+W快捷鍵,為對話框資源IDD_EDIT創(chuàng)建一個對話框類CEditDlg。,5.3常用控件,(5)打開ClassWizard的Member Variables標(biāo)簽,在Class name中選擇CEditDlg,選中所需的控件ID號,雙擊鼠標(biāo)或單擊Add Variables按鈕。依次為控件增加成員變量。 (
31、6)切換到ClassWizard的Messsage Maps標(biāo)簽頁,為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();
32、/ 將控件顯示的數(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.
33、h” (10)編譯運(yùn)行并測試。,作業(yè),1.P375:1,3,6,8,10 2.P412:實(shí)驗(yàn)9,5.3常用控件,5.3.3列表框 列表框的風(fēng)格,圖5.25 列表框的屬性對話框,5.3常用控件,列表框的基本操作 (1)添加列表項(xiàng) 列表框創(chuàng)建時是一個空的列表,需要添加或插入一些列表項(xiàng)。CListBox類成員函數(shù)AddString 和InsertString用來向列表框增加列表項(xiàng),原型: int AddString( LPCTSTR lpszItem ); int InsertString( int nIndex, LPCTSTR lpszItem ); CListBox的SetItemData和S
34、etItemDataPtr能使數(shù)據(jù)和某個列表項(xiàng)關(guān)聯(lián)起來。 int SetItemData( int nIndex, DWORD dwItemData ); int SetItemDataPtr( int nIndex, void* pData ); (2)刪除列表項(xiàng) CListBox類成員函數(shù)DeleteString和ResetContent分別用來刪除指定的列表項(xiàng)和清除列表框所有項(xiàng)目。它們的函數(shù)原型如下: int DeleteString( UINT nIndex );/ nIndex指定要刪除的列表項(xiàng)的索引 void ResetContent( ); 若在添加列表項(xiàng)時使用SetItemDa
35、taPtr函數(shù),不要忘記在進(jìn)行刪除操作時及時將關(guān)聯(lián)數(shù)據(jù)所占的內(nèi)存空間釋放出來。,5.3常用控件,(3)查找列表項(xiàng) CListBox類成員函數(shù)FindString 和FindStringExact分別用來在列表框中查找所匹配的列表項(xiàng),其中FindStringExact的查找精度最高。 int FindString( int nStartAfter, LPCTSTR lpszItem ) const; int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const; lpszFind和lpszItem指定要查找的列表項(xiàng)文本,nStart
36、After和nIndexStart指定查找的開始位置,若為-1,則從頭至尾查找。查到后,這兩個函數(shù)都將返回所匹配列表項(xiàng)的索引,否則返回LB_ERR。 (4)列表框的單項(xiàng)選擇 當(dāng)選中列表框中某個列表項(xiàng),可以使用CListBox:GetCurSel來獲取這個結(jié)果,與該函數(shù)相對應(yīng)的CListBox:SetCurSel 函數(shù)是用來設(shè)定某個列表項(xiàng)呈選中狀態(tài)(高亮顯示)。 int GetCurSel( ) const;/ 返回當(dāng)前選擇項(xiàng)的索引 int SetCurSel( int nSelect ); nSelect指定要設(shè)置的列表項(xiàng)索引,錯誤時這兩個函數(shù)都將返回LB_ERR。 若要獲取某個列表項(xiàng)的字符串
37、,可使用下列函數(shù): int GetText( int nIndex, LPTSTR lpszBuffer ) const; void GetText( int nIndex, CString nIndex指定列表項(xiàng)索引,lpszBuffer 和rString是用來存放列表項(xiàng)文本。,5.3常用控件,(5)列表框的多項(xiàng)選擇 在列表框的Style屬性對話框中選中多選(Multiple)或擴(kuò)展多選(Extended)類型后,就可以在列表框中進(jìn)行多項(xiàng)選擇。要想獲得選中的多個選項(xiàng),通過需要用ClassWizrd映射LBN_SELCHANGE消息,添加類似代碼: void CListBoxDlg:OnSel
38、changeList1() int nCount = m_list.GetSelCount();/ 獲取用戶選中的項(xiàng)數(shù) if (nCount != LB_ERR) int *buffer = new intnCount;/ 開辟緩沖區(qū) m_list.GetSelItems(nCount,buffer); CString allStr, str; allStr.Empty();/ 字符串清空 for (int i=0; inCount; i+) m_list.GetText(bufferi, str); allStr = allStr + “” + str + “”; delete buffer
39、;/ 釋放內(nèi)存 / MessageBox(allStr);/ 處理獲得的文本 ,5.3常用控件,列表框的通知消息 例Ex_Ctrls3 將一個SCORE結(jié)構(gòu)(含有三門成績的數(shù)據(jù)成員)數(shù)據(jù)和列表框中每一個學(xué)生姓名列表關(guān)聯(lián)起來。用戶單擊添加記錄按鈕時,學(xué)生成績記錄中的“姓名”被添加在列表框中,該學(xué)生的成績與該列表項(xiàng)關(guān)聯(lián)。單擊刪除記錄時,列表框中當(dāng)前選擇項(xiàng)被刪除,相關(guān)聯(lián)的數(shù)據(jù)所占的內(nèi)容空間被釋放。任何時候選中列表框中某個學(xué)生,相應(yīng)的記錄數(shù)據(jù)都被顯示出來。 (1)打開前面創(chuàng)建的基于對話框應(yīng)用程序程序項(xiàng)目Ex_CommCtrls。 (2)向應(yīng)用程序中添加一個對話框資源IDD_LISTBOX,標(biāo)題定為“使
40、用列表框”,用ClassWizard為此對話框類定義為CListBoxDlg。 (3)刪除原來的Cancel按鈕,用編輯器為對話框添加如下表所示的控件。,5.3常用控件,(4)打開ClassWizard的Member Variables頁面,在Class name中選擇CListBoxDlg,選中所需的控件ID號,雙擊鼠標(biāo)或單擊Add Variables按鈕。 (5)切換到ClassWizard的Messsage Maps標(biāo)簽頁,為按鈕IDC_DATA_ADD添加BN_CLICKED的消息映射,增加代碼: void CListBoxDlg:OnDataAdd() UpdateData(TRUE
41、); 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é)生成
42、績與新增的列表項(xiàng)關(guān)聯(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();/ 獲得當(dāng)前選擇項(xiàng)的索引 if (nIndex != LB
43、_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)前沒有選擇項(xiàng)或列表框操作失??!); (7)用ClassWizard為按鈕IDC_LIST1添加LBN_SELCHANGE的消息映射,增加代碼: void CListBoxDlg:OnSelchangeList1() int nIndex = m_List.GetCurSel(); if (nIndex != LB_ERR)
44、 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() / 此消息是當(dāng)對話框關(guān)閉時發(fā)送的 for (int nIndex = m_
45、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)閉對話框 對話框被清除時發(fā)送WM_DESTROY消息。用戶在此消息的映射函數(shù)中添加一些對象刪除代碼,以便在對話框清除前有效地釋放內(nèi)存空間。,5.3常用控件,(9)打開ListBoxDlg.h源文件,在類CListBoxDlg定義的public處添加下列代碼: public: struct SCORE int score1;
46、 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) 編譯運(yùn)行并測試。,5.3常用控件,5.3.4組合框 組合框的風(fēng)格及類型,圖5.27 組合框的屬性對話框,5.3常用控件,組合框常見操作 組合框的操作大致分為兩類,一類是對組合框中的列表
47、框進(jìn)行操作,另一類是對組合框中的編輯框進(jìn)行操作。這些操作都可以調(diào)用CComboBox成員函數(shù)來實(shí)現(xiàn)。 組合框的通知消息 繪圖時還需要下列一些技巧: 需要更新或重新繪制窗口的外觀時,應(yīng)用程序就會發(fā)送WM_PAINT消息。用ClassWizard在對話框中映射WM_PAINT消息的目的是執(zhí)行繪圖代碼。 防止用系統(tǒng)默認(rèn)的顏色向?qū)υ捒蜻M(jìn)行重復(fù)繪制,須調(diào)用UpdateWindow函數(shù)。UpdateWindow是CWnd的無參數(shù)的成員函數(shù),目的是繞過系統(tǒng)的消息列隊,直接發(fā)送或停止發(fā)送WM_PAINT消息。窗口沒有需要更新的區(qū)域時,就停止發(fā)送。繪制完圖形時,沒有WM_PAINT消息的發(fā)送,系統(tǒng)不會用默認(rèn)的顏
48、色對窗口進(jìn)行重復(fù)繪制。 如果對話框中的任何部分變?yōu)闊o效時,對話框的OnPaint函數(shù)都會自動調(diào)用??梢酝ㄟ^調(diào)用Invalidate函數(shù)來通知系統(tǒng)此時的窗口狀態(tài)已變?yōu)闊o效,強(qiáng)制系統(tǒng)調(diào)用WM_PAINT消息函數(shù)OnPaint重新繪制。,5.3常用控件,例Ex_Ctrls4 根據(jù)用戶從組合框中選擇的填充樣式,在對話框中繪制一個矩形區(qū)域,如圖。 (1)打開前面創(chuàng)建的基于對話框應(yīng)用程序程序項(xiàng)目Ex_CommCtrls。 (2)向應(yīng)用程序中添加一個對話框資源IDD_COMBO,標(biāo)題定為“使用組合框”,用ClassWizard為此對話框類定義為CComboDlg。 (3) 刪除原來的Cancel按鈕,用編輯
49、器為對話框添加控件。,5.3常用控件,(4)打開ClassWizard的Member Variables標(biāo)簽,為組合框IDC_PATTERN增加成員變量m_Pattern,其類型為Control類的CComboBox。 (5)為CComboDlg類添加一個int類型的成員變量m_nDrawPattern。 (6)切換到ClassWizard的Messsage Maps標(biāo)簽頁,為組合框IDC_PATTERN添加CBN_SELCHANGE(組合框中的當(dāng)前選項(xiàng)發(fā)生改變)的消息映射,并增加下列代碼: void CComboDlg:OnSelchangePattern() int nIndex = m_
50、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為對話框添加WM_PAINT的消息映射,并增加下列代碼: void CComboDlg:OnPaint() CPaintDC dc(this); / device context for painting(繪圖所必須的設(shè)備環(huán)境) CWnd* pW
51、nd = GetDlgItem(IDC_DRAW);/ 獲得控件IDC_DRAW的窗口指針 pWnd-UpdateWindow();/ 避免系統(tǒng)自動重繪 CDC* pDC = pWnd-GetDC();/ 獲得所需要的繪圖設(shè)備環(huán)境 CBrush drawBrush;/ 定義一個畫刷 drawBrush.CreateHatchBrush(m_nDrawPattern,RGB(0,0,0);/ 創(chuàng)建畫刷 CBrush* pOldBrush = pDC-SelectObject(/ 恢復(fù)設(shè)備環(huán)境原來的畫刷設(shè)置 ,5.3常用控件,(8)用ClassWizard為對話框添加WM_INITDIALOG的消
52、息映射,增加代碼: BOOL CComboDlg:OnInitDialog() CDialog:OnInitDialog(); CString str6 = 水平線,豎直線,向下斜線,向上斜線,十字線,交叉線; int nIndex; for (int i=0; i6; i+) nIndex = m_Pattern.AddString(stri); m_Pattern.SetItemData(nIndex,i); m_Pattern.SetCurSel(0); m_nDrawPattern = 0; return TRUE; ,5.3常用控件,(9)定位到CEx_CommCtrlsDlg:On
53、Button1函數(shù)處,修改代碼如下: if (nID = IDC_RADIO3) CComboDlg dlg; dlg.DoModal(); (10)在Ex_CommCtrlsDlg.cpp文件的開始處,增加包含CComboDlg的頭文件。 #include “ComboDlg.h” (11)編譯運(yùn)行并測試。,5.3常用控件,5.3.5滾動條和進(jìn)展條 滾動條 (1)滾動條的基本操作 在MFC的CScrollBar類中,函數(shù)SetScrollRange是用來設(shè)置滾動條的滾動范圍的,其原型如下: SetScrollRange( int nMinPos, int nMaxPos, BOOL bRed
54、raw = TRUE ); 在CScrollBar類中,設(shè)置滾動塊位置操作是由SetScrollPos函數(shù)來完成的,其原型如下: int SetScrollPos( int nPos, BOOL bRedraw = TRUE ); 與SetScrollRange 和SetScrollPos相對應(yīng)的兩個函數(shù)是分別用來獲取滾動條的當(dāng)前范圍以及當(dāng)前滾動位置: void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) ; int GetScrollPos(); 需要說明的是:在CScrollBar類的成員函數(shù)中,還可以用SetScrollInfo和Ge
55、tScrollInfo來代替上面提到的四個函數(shù)。與前面的函數(shù)相比,使用SetScrollInfo函數(shù)還能使?jié)L動塊的大小隨內(nèi)容的多少而改變。,5.3常用控件,(2) WM_HSCROLL或WM_VSCROLL消息 滾動條進(jìn)行操作時,會向父窗口發(fā)送WM_HSCROLL或WM_VSCROLL消息。通過ClassWziard在其對話框中進(jìn)行映射,產(chǎn)生相應(yīng)的消息映射函數(shù)OnHScroll和OnVScroll,函數(shù)原型: afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar ); afx_msg void OnVSc
56、roll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );,5.3常用控件,進(jìn)展條 (1)進(jìn)展條的風(fēng)格 打開進(jìn)展條的屬性對話框。Border指定進(jìn)展條是否有邊框,Vertical指定進(jìn)展是水平還是垂直的。Smooth表示平滑地填充進(jìn)展條。 (2)進(jìn)展條的基本操作 基本操作:設(shè)置范圍、當(dāng)前位置、增量等。通過相關(guān)的CProgressCtrl類成員函數(shù)實(shí)現(xiàn)。 int SetPos( int nPos ); int GetPos(); 這兩個函數(shù)分別用來設(shè)置和獲取進(jìn)展條的當(dāng)前位置。 void SetRange( short nLower, shor
57、t nUpper ); void SetRange32(int nLower, int nUpper ); void GetRange( int 該函數(shù)將當(dāng)前位置向前移動一個步長并重畫進(jìn)展條以反映新的位置。,5.3常用控件,5.3.6旋轉(zhuǎn)按鈕控件和滑動條 旋轉(zhuǎn)按鈕控件 (1)旋轉(zhuǎn)按鈕控件常用的風(fēng)格,圖5.35 旋轉(zhuǎn)按鈕控件屬性對話框,5.3常用控件,(2)旋轉(zhuǎn)按鈕控件的基本操作 成員函數(shù)SetBase是用來設(shè)置其基數(shù)的,函數(shù)的原型如下: int SetBase( int nBase ); 成員函數(shù)SetPos和SetRange設(shè)置旋轉(zhuǎn)按鈕控件的當(dāng)前位置和范圍,它們的函數(shù)原型如下: int Se
58、tPos( int nPos ); void SetRange( int nLower, int nUpper ); 成員函數(shù)SetAccel和GetAccel用來設(shè)置和獲取旋轉(zhuǎn)按鈕控件的加速度。其中函數(shù)SetAccel的原型如下: BOOL SetAccel( int nAccel, UDACCEL* pAccel ); 參數(shù)nAccel表示由pAccel指定的UDACCEL結(jié)構(gòu)的數(shù)目。pAccel指向一個UDACCEL結(jié)構(gòu)數(shù)組的指針,該數(shù)組包含了加速信息,其結(jié)構(gòu)如下: typedef struct UINT nSec; / 位置改變前所等待的秒數(shù)。 UINTnInc; / 位置增量。 UD
59、ACCEL, FAR *LPUDACCEL; (3)旋轉(zhuǎn)按鈕控件的通知消息 旋轉(zhuǎn)按鈕控件的通知消息只有一個:UDN_DELTAPOS,它是當(dāng)控件的當(dāng)前數(shù)值將要改變時向其父窗口發(fā)送的。,5.3常用控件,滑動條 (1)滑動條的風(fēng)格,圖5.37 滑動條屬性對話框,5.3常用控件,(2)滑動條的基本操作 成員函數(shù)SetPos和SetRange用來設(shè)置滑動條的位置和范圍,原型如下: void SetPos( int nPos ); void SetRange( int nMin, int nMax, BOOL bRedraw = FALSE ); 成員函數(shù)SetTic用來設(shè)置滑動條控件中的一個刻度線的位置。函數(shù)成功調(diào)用后返回非零值;否則返回0。函數(shù)原型如下: BOOL SetTic( int nTic ); 成員函數(shù)SetTicFreq設(shè)置顯示在滑動條中的刻度線的疏密程度。原型如下: void SetTicFreq( int nFreq ); 成員函數(shù)ClearTics用來從滑動條控件中刪除當(dāng)前的刻度線。
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026福建省青少年科技教育協(xié)會招聘2人筆試模擬試題及答案解析
- 2025河北唐山開灤總醫(yī)院招收就業(yè)見習(xí)人員60人(公共基礎(chǔ)知識)綜合能力測試題附答案
- 2025安徽皖信人力資源管理有限公司招聘望江某電力外委人員1人(公共基礎(chǔ)知識)綜合能力測試題附答案
- 2025廣東江門市臺山市啟曜工程咨詢有限公司總經(jīng)理市場化選聘1人(公共基礎(chǔ)知識)綜合能力測試題附答案
- 2025廣東中山市三鄉(xiāng)鎮(zhèn)鎮(zhèn)屬企業(yè)管理人員招聘2人備考題庫附答案
- 2026山東濟(jì)寧市曲阜市教育系統(tǒng)急需緊缺人才招聘10人筆試模擬試題及答案解析
- 2026福建省三鋼(集團(tuán))有限責(zé)任公司社會招聘6人筆試模擬試題及答案解析
- 2025秋人教版道德與法治八年級上冊3.2營造清朗空間教學(xué)設(shè)計
- 2025秋人教版道德與法治八年級上冊7.2踐行平等同步練習(xí)
- 2026湖北省面向北京科技大學(xué)普通選調(diào)生招錄筆試備考題庫及答案解析
- 遺產(chǎn)分割協(xié)議書
- 京瓷哲學(xué)手冊樣本
- 形神拳動作名稱與圖解
- 博士生入學(xué)復(fù)試面試報告?zhèn)€人簡歷介紹含內(nèi)容模板兩篇
- 食品工廠設(shè)計 課件 第二章 廠址選擇
- 2023年生產(chǎn)車間各類文件匯總
- WORD版A4橫版密封條打印模板(可編輯)
- 2013標(biāo)致508使用說明書
- 中考滿分(合集15篇)
- 《大數(shù)據(jù)營銷》-課程教學(xué)大綱
- GB/T 18993.1-2020冷熱水用氯化聚氯乙烯(PVC-C)管道系統(tǒng)第1部分:總則
評論
0/150
提交評論