版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章常用控件控件是Windows應(yīng)用程序圖形界面的重要組成部分,用戶可以通過控件完成與應(yīng)用程序的交互。在VisualC++6.0中,MFC封裝了Windows的許多標(biāo)準(zhǔn)控件。利用MFC可以快速方便地使用Windows的標(biāo)準(zhǔn)控件完成應(yīng)用程序開發(fā)。本章介紹Windows應(yīng)用程序中常用的一些標(biāo)準(zhǔn)控件。學(xué)習(xí)本章,讀者可以掌握Windows標(biāo)準(zhǔn)控件的使用方法。8.1概述控件是Windows的標(biāo)準(zhǔn)窗口的一種,它具有和普通窗口一樣的屬性。Windows系統(tǒng)提供了很多標(biāo)準(zhǔn)控件,例如按鈕、滾動(dòng)條、編輯框、列表視圖等??丶?shí)際上是子窗口,在應(yīng)用程序與用戶進(jìn)行交互的過程中,控件是主要角色。MFC提供了大量的控件類,它們封裝了控件的功能。通過這些控件類,程序可以方便地創(chuàng)建控件,對(duì)控件進(jìn)行查詢和控制。所有的控件類都是CWnd類的直接或間接派生類。在MFC中的控件類提供了對(duì)控件進(jìn)行操作的基本函數(shù),包括控件的顯示,控件的屬性等。在應(yīng)用程序中,控件發(fā)送WM_COMMAND消息進(jìn)行相關(guān)的通信。同控件發(fā)送消息的通知碼有所不同,常用控件的消息及其含義如表8.1所示。表8.1常用控件的常用消息上面給出了常用的幾種控件的常見消息。一種控件經(jīng)常通過對(duì)某種特定的消息進(jìn)行一定的響應(yīng),然后在消息響應(yīng)函數(shù)中進(jìn)行一些處理,從而運(yùn)行整個(gè)程序。這也是Windows應(yīng)用程序事件驅(qū)動(dòng)模型的體現(xiàn)。控
件消
息含
義按鈕控件BN_CLICKED用戶單擊按鈕控件BN_DOUBLECLICKED用戶雙擊按鈕控件編輯框控件EN_SETFOCUS編輯框獲得輸入焦點(diǎn)EN_CHANGE用戶更改輸入框中的數(shù)據(jù)編輯框控件EN_MAXTEXT輸入內(nèi)容超過編輯框最大容量EN_KILLFOCUS編輯框失去輸入焦點(diǎn)EN_VSCROLL垂直滾動(dòng)條被按下并激活列表框控件LBN_DBLCLK字符串列表框的字符串被雙擊LBN_SELCHANGE字符串列表框中的選擇發(fā)生改變LBN_SETFOCUS列表框獲得輸入焦點(diǎn)LBN_KILLFOCUS列表框失去輸入焦點(diǎn)LBN_SELCANCEL在列表框中取消某個(gè)選擇組合框控件CBN_DBLCLK選擇組合框的字符串雙擊CBN_EDITCHANGE組合框的內(nèi)容被修改CBN_EDITUPDATE組合框的內(nèi)容被更新CBN_KILLFOCUS組合框失去輸入焦點(diǎn)CBN_SETFOCUS組合框得到輸入焦點(diǎn)8.2按鈕控件按鈕控件是Windows應(yīng)用程序中最常用的標(biāo)準(zhǔn)控件之一。它通常是可以響應(yīng)鼠標(biāo)單擊消息的矩形小窗口。按鈕的標(biāo)題通常是顯示單擊按鈕所要引發(fā)的操作。一般來說,按鈕控件除了常見的矩形小窗口外,還有很多種類。主要有以下幾種。1.單選按鈕其外型為一個(gè)小圓圈和一個(gè)按鈕文本。當(dāng)圓形按鈕被選中時(shí),該圓圈將加點(diǎn)顯示。圓形按鈕所包含的各個(gè)選項(xiàng)之間一般具有互斥關(guān)系,即一組單選按鈕里只能選擇其中的一個(gè)。2.復(fù)選按鈕復(fù)選按鈕又稱為復(fù)選框,其外型為一個(gè)小方框和一個(gè)按鈕文本。當(dāng)復(fù)選按鈕被選中時(shí),在相應(yīng)的方框內(nèi)出現(xiàn)一個(gè)“√”。復(fù)選框所包含的一組選項(xiàng)中一般不包含互斥內(nèi)容,用戶可以選擇一個(gè)或多個(gè)復(fù)選框。
說明:自動(dòng)單選按鈕和自動(dòng)復(fù)選框與一般單選按鈕和復(fù)選框的區(qū)別是,如果設(shè)置為自動(dòng)風(fēng)格,那么按鈕會(huì)自動(dòng)響應(yīng),程序員不用編寫消息響應(yīng)函數(shù)。普通按鈕、單選按鈕和復(fù)選按鈕的基本樣式如圖8.1所示。圖8.1按鈕樣式8.2.1創(chuàng)建按鈕控件MFC中利用CButton類封裝了按鈕控件。它是由類CWnd派生的類。CButton類的常用成員函數(shù)如表8.2所示。表8.2
CButton的成員函數(shù)上面列出了CButton類的成員函數(shù),利用Create()函數(shù)可以創(chuàng)建一個(gè)按鈕控件。在實(shí)際的程序設(shè)計(jì)中,經(jīng)常在資源編輯器中添加按鈕控件。MFC已經(jīng)做好了基本的工作,如果要對(duì)按鈕進(jìn)行進(jìn)一步操作,可以創(chuàng)建CButton的對(duì)象,進(jìn)行進(jìn)一步操作。函
數(shù)說
明BOOLCreate(……);創(chuàng)建按鈕控件UINTGetState()const;獲得按鈕控件的選中、選擇和聚焦?fàn)顟B(tài)voidSetState(BOOLbHighlight);設(shè)置一個(gè)按鈕控件的選擇狀態(tài)intGetCheck()const;返回單選按鈕的選擇狀態(tài)voidSetCheck(intnCheck);設(shè)置單選按鈕的狀態(tài)UINTGetButtonStyle()const;獲得按鈕的樣式信息voidSetButtonStyle(UINTnStyle,BOOLbRedraw=TRUE);設(shè)置按鈕的樣式HICONGetIcon()const;獲得按鈕上的圖標(biāo)句柄HICONSetIcon(HICONhIcon);設(shè)置按鈕上的圖標(biāo)HBITMAPGetBitmap()const;獲得按鈕上的位圖的句柄HBITMAPSetBitmap(HBITMAPhBitmap);設(shè)置按鈕上的位圖HCURSORGetCursor();獲得按鈕上的光標(biāo)的句柄HCURSORSetCursor(HCURSORhCursor);設(shè)置按鈕上的光標(biāo)virtualvoidDrawItem(……);重載該函數(shù)繪制一個(gè)CButton對(duì)象8.2.2使用按鈕控件上面介紹了CButton類,現(xiàn)在根據(jù)示例介紹按鈕控件的使用?!臼纠?.1】編寫一個(gè)上網(wǎng)情況調(diào)查應(yīng)用程序,利用按鈕控件實(shí)現(xiàn)基本操作。程序設(shè)計(jì)的基本操作步驟如下所述。(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,在上面添加多個(gè)按鈕控件并設(shè)置標(biāo)題,如圖8.2所示。圖8.2運(yùn)行效果(2)利用向?qū)榘粹o控件添加變量。為了進(jìn)行按鈕的使用性學(xué)習(xí),為每個(gè)按鈕添加一個(gè)控制型變量。(3)添加單擊確定按鈕的消息響應(yīng)函數(shù)。函數(shù)體如下:(4)編譯、連接,運(yùn)行結(jié)果如圖8.3所示。圖8.3運(yùn)行結(jié)果上面的例子是按鈕控件的常見使用模型,即通過資源編輯環(huán)境編輯按鈕控件。并且設(shè)置其樣式、標(biāo)題等,然后利用類向?qū)砑訂螕舭粹o或者雙擊按鈕的消息映射,編寫函數(shù)體,處理消息響應(yīng)。8.3滾動(dòng)條控件滾動(dòng)條是Windows應(yīng)用程序中常見的控件。滾動(dòng)條在形式上分為窗口滾動(dòng)條控件和子窗口滾動(dòng)條控件兩種。窗口滾動(dòng)條控件是由系統(tǒng)創(chuàng)建,例如單文檔程序中的窗口滾動(dòng)條。子窗口滾動(dòng)條控件則需要由程序員自己進(jìn)行定義。8.3.1創(chuàng)建滾動(dòng)條在MFC中,滾動(dòng)條類是CScrollBar類,它由CWnd類派生。滾動(dòng)條最常見的操作是實(shí)現(xiàn)窗口的滾動(dòng),包括垂直和水平方向兩種。CScrollBar類的成員函數(shù)如表8.3所示。表8.3
CScrollBar類的成員函數(shù)在使用滾動(dòng)條時(shí),首先創(chuàng)建一個(gè)CScrollBar類的對(duì)象,然后調(diào)用初始化該對(duì)象。在實(shí)際應(yīng)用中,經(jīng)常直接使用資源編輯器中提供的控件。
注意:初始化對(duì)象時(shí)需要設(shè)置滾動(dòng)條的范圍和滾動(dòng)條的當(dāng)前位置。函
數(shù)說
明BOOLCreate(……);創(chuàng)建滾動(dòng)條控件intGetScrollPos()const;獲取滾動(dòng)條當(dāng)前位置intSetScrollPos(intnPos,BOOLbRedraw=TRUE);設(shè)置滾動(dòng)條當(dāng)前位置voidGetScrollRange(LPINTlpMinPos,LPINTlpMaxPos)const;獲取滾動(dòng)條最大和最小位置voidSetScrollRange(intnMinPos,intnMaxPos,BOOLbRedraw=TRUE);設(shè)置滾動(dòng)條最大和最小位置voidShowScrollBar(BOOLbShow=TRUE);顯示或隱藏滾動(dòng)條控件BOOLEnableScrollBar(UINTnArrowFlags=ESB_ENABLE_BOTH);使?jié)L動(dòng)無效BOOLSetScrollInfo(……);設(shè)置滾動(dòng)條信息BOOLGetScrollInfo(LPSCROLLINFOlpScrollInfo,UINTnMask);獲取滾動(dòng)條信息intGetScrollLimit();獲取滾動(dòng)條的范圍8.3.2使用滾動(dòng)條控件下面結(jié)合實(shí)例講解滾動(dòng)條控件的使用方法?!臼纠?.2】在對(duì)話框中放置滾動(dòng)條控件,實(shí)現(xiàn)滾動(dòng)條滑塊的移動(dòng)。操作步驟如下所述。(1)創(chuàng)建基于對(duì)話框的應(yīng)用程序,在上面添加一個(gè)滾動(dòng)條控件。如圖8.4所示。圖8.4添加滾動(dòng)條控件(2)利用類向?qū)闈L動(dòng)條控件添加控制類型變量m_test。(3)在函數(shù)OnInitDialog()中對(duì)m_test變量進(jìn)行初始化處理,在returnTRUE;語句前面添加代碼如下:m_test.SetScrollRange(0,100);
//滾動(dòng)條范圍0到100m_test.SetScrollPos(10);
//當(dāng)前位置為10注意:垂直滾動(dòng)條的位置從上到下,即最上邊為0。橫向滾動(dòng)條的位置從左到右,即最左邊為0。(4)利用類向?qū)砑酉㈨憫?yīng)函數(shù)。由于滾動(dòng)條本身沒有與之相應(yīng)的事件,對(duì)滾動(dòng)條的操作是通過對(duì)話框的OnVScroll事件來進(jìn)行的。因此添加消息響應(yīng)函數(shù)實(shí)際上是添加對(duì)話框的OnVScroll事件的消息響應(yīng)函數(shù)。由于OnVScroll事件是對(duì)整個(gè)對(duì)話框進(jìn)行的,因此如果這個(gè)對(duì)話框中有多個(gè)滾動(dòng)條控件,那么如何區(qū)分到底是哪一個(gè)滾動(dòng)條動(dòng)作了呢?實(shí)際上只需要在OnVScroll()函數(shù)中進(jìn)行判斷就可以了。它的一個(gè)參數(shù)就是用來確定是哪一個(gè)滾動(dòng)條的動(dòng)作。編寫函數(shù)代碼如下:(5)編譯、連接,運(yùn)行結(jié)果如圖8.5所示。圖8.5運(yùn)行結(jié)果上面的例子是滾動(dòng)條控件的常見用法,在實(shí)際的文本顯示或者其他需要滾動(dòng)顯示的地方經(jīng)常使用滾動(dòng)條控件。例如Word的右側(cè)一般都會(huì)出現(xiàn)滾動(dòng)條以實(shí)現(xiàn)快速翻頁定位的操作。8.4靜態(tài)文本控件在Windows程序中經(jīng)常利用靜態(tài)文本控件來顯示一些控件的標(biāo)題等。例如編輯框前面的標(biāo)題,用來說明編輯框的內(nèi)容是什么。實(shí)際應(yīng)用中對(duì)靜態(tài)文本控件的操作不多,但是有時(shí)需要改變文本框的內(nèi)容。本節(jié)就這一問題進(jìn)行介紹。靜態(tài)文本控件的類是CStatic類,它是從CWnd派生出來的類。因此它繼承了CWnd類的所有功能。若要改變靜態(tài)文本的內(nèi)容只需要利用該類的一個(gè)成員函數(shù)SetWindowText();就可以實(shí)現(xiàn)。通過上面的介紹,如果想在對(duì)話框上添加一個(gè)靜態(tài)文本控件,并在程序中動(dòng)態(tài)地改變其內(nèi)容,那么基本步驟如下所述。(1)在資源編輯器中添加靜態(tài)文本控件。(2)利用類向?qū)砑屿o態(tài)文本控件的控制類型的變量。(3)在程序需要進(jìn)行改變靜態(tài)文本內(nèi)容的地方調(diào)用SetWindowText();函數(shù)。注意:如果需要為靜態(tài)文本控件添加變量,則需要改變控件的默認(rèn)ID。這是因?yàn)樗徐o態(tài)文本控件的默認(rèn)ID都相同。8.5列表框控件列表框控件是可以在若干選項(xiàng)中進(jìn)行選擇操作的控件。它可以顯示出多個(gè)選項(xiàng),可以允許用戶進(jìn)行唯一或者多項(xiàng)選擇。利用該控件,在應(yīng)用程序需要進(jìn)行選項(xiàng)選擇的地方可以帶來很大方便。8.5.1列表框控件相關(guān)類列表框控件的類是CListBox,這也是一個(gè)從CWnd派生出來的類。CListBox中提供了許多函數(shù)以進(jìn)行操作,其中主要的操作分為通用操作、單選列表框、多選列表框和字符串操作幾類。下面分別進(jìn)行介紹。1.通用操作通用操作用來獲得和設(shè)置列表框控件選項(xiàng)的基本狀態(tài)和屬性。無論是單選列表框還是多選列表框都可以進(jìn)行通用操作,對(duì)列表框的屬性進(jìn)行設(shè)置。列表框控件的通用操作如表8.4所示。表8.4CListBox類的通用操作函
數(shù)說
明intGetCount()const;獲得列表框中選項(xiàng)的個(gè)數(shù)intGetHorizontalExtent()const;獲得列表框水平滾動(dòng)寬度voidSetHorizontalExtent(intcxExtent);設(shè)置列表框水平滾動(dòng)寬度intGetTopIndex()const;獲得列表框中第一個(gè)可用項(xiàng)的下標(biāo)intSetTopIndex(intnIndex);設(shè)置列表框中第一個(gè)可用項(xiàng)的下標(biāo)intGetSel(intnIndex)const;確定列表項(xiàng)的選擇狀態(tài)intSetItemHeight(intnIndex,UINTcyItemHeight);設(shè)置列表框中項(xiàng)的高度intGetItemHeight(intnIndex)const;設(shè)置列表框中項(xiàng)的高度2.單選列表框單選列表框是在實(shí)際中應(yīng)用最廣泛的列表框控件,它允許用戶選擇其選項(xiàng)中的一項(xiàng)。通用操作都可以對(duì)單選列表框進(jìn)行操作,在此不再重復(fù)。單選列表框的操作如表8.5所示。表8.5單選列表框的操作
函
數(shù)說
明intGetCurSel()const;獲得當(dāng)前選項(xiàng)的下標(biāo)
intSetCurSel(intnSelect);選擇列表框某個(gè)下標(biāo)的選項(xiàng)
3.多選列表框多選列表框允許用戶選擇其選項(xiàng)中的一項(xiàng)或多項(xiàng)。它是對(duì)單選列表框的擴(kuò)展,同時(shí)它本身擁有許多特殊的操作。多選列表框的操作如表8.6所示。表8.6多選列表框的操作函
數(shù)說
明intSetSel(intnIndex,BOOLbSelect=TRUE);在列表框中切換項(xiàng)目的選擇狀態(tài)intGetCaretIndex()const;獲得列表框中具有光標(biāo)矩形項(xiàng)的下標(biāo)intSetCaretIndex(intnIndex,BOOLbScroll=TRUE);在列表框中指定項(xiàng)具有光標(biāo)矩形intGetSelCount()const;獲得當(dāng)前所選項(xiàng)的數(shù)目intGetSelItems(intnMaxItems,LPINTrgIndex)const;將當(dāng)前所選項(xiàng)的下標(biāo)放到整型數(shù)組中intSelItemRange(BOOLbSelect,intnFirstItem,intnLastItem);切換列表框項(xiàng)范圍的選擇狀態(tài)intGetAnchorIndex()const;獲得當(dāng)前定位項(xiàng)的下標(biāo)4.字符串操作字符串操作是對(duì)列表框中的選項(xiàng)進(jìn)行處理的操作,包括添加選項(xiàng)、刪除選項(xiàng)等。它適用于單選和多選列表框。字符串操作如表8.7所示。表8.7字符串操作列表框利用Create()函數(shù)創(chuàng)建列表框控件,但在實(shí)際應(yīng)用中,程序員只需要在資源編輯器中添加列表框控件并設(shè)置其屬性就可以了。函
數(shù)說
明intAddString(LPCTSTRlpszItem);在列表框中加入一個(gè)字符串intDeleteString(UINTnIndex);在列表框中刪除一個(gè)字符串intInsertString(intnIndex,LPCTSTRlpszItem);在列表框指定下標(biāo)處插入一個(gè)字符串voidResetContent();清除列表框所有選項(xiàng)intDir(UINTattr,LPCTSTRlpszWildCard);當(dāng)前目錄下文件的文件名加入到列表框intFindString(intnStartAfter,LPCTSTRlpszItem)const;在列表框指定下標(biāo)開始查找字符串intFindStringExact(intnIndexStart,LPCTSTRlpszFind)const;在列表框中查找第一個(gè)匹配的字符串intSelectString(intnStartAfter,LPCTSTRlpszItem);在列表框中查找并選擇某個(gè)字符串選項(xiàng)8.5.2使用列表框通過上面的講解,可以看到列表框的基本使用方法。在實(shí)際應(yīng)用中,列表框如何使用呢?大家知道Windows控件通過發(fā)送WM_COMMAND與應(yīng)用程序進(jìn)行通信。因此只需要利用類向?qū)砑酉鄳?yīng)的消息響應(yīng)函數(shù)就可以完成列表框的操作。下面通過實(shí)例講解列表框在實(shí)際應(yīng)用中的使用。【示例8.3】列表框控件使用舉例。在對(duì)話框中添加列表框控件,列出多個(gè)選項(xiàng),調(diào)查用戶的愛好。單/雙擊某個(gè)選項(xiàng)時(shí),提示用戶單擊選擇(允許用戶選擇多項(xiàng))。操作步驟如下所述。(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)在對(duì)話框中添加一個(gè)列表框控件,設(shè)置其屬性,如圖8.6所示。在設(shè)置中需要注意的是Styles屬性頁里的Selections下拉列表框。它有4種選擇,Single表示一次只可以選擇一個(gè)選項(xiàng),即列表框是單選列表框;Multiple表示一次可以選擇多個(gè)選項(xiàng),即是多選列表框;Extended表示可以一次可以選擇多個(gè)選項(xiàng),與Multiple不同的是它可以通過拖動(dòng)鼠標(biāo)的方式選擇多個(gè)選項(xiàng);None表示不能選擇。在此,將其設(shè)置為Multiple。圖8.6設(shè)置屬性(3)利用類向?qū)榱斜砜蚩丶砑涌刂菩妥兞縨_list。(4)在BOOLCTestDlg::OnInitDialog()中添加代碼如下:說明:一般對(duì)對(duì)話框的初始化工作都在OnInitDialog()函數(shù)中完成,并且需要把代碼加在returnTRUE;語句的前面。(5)利用類向?qū)砑訂螕簟按_定”按鈕時(shí)的消息響應(yīng)函數(shù),編寫函數(shù)體,代碼如下:上面的函數(shù)是在單擊時(shí)對(duì)從上到下的各個(gè)選項(xiàng)進(jìn)行檢驗(yàn),如果該項(xiàng)被選中,則將該項(xiàng)加入到字符串中。(6)添加一個(gè)雙擊某個(gè)選項(xiàng)時(shí)的消息響應(yīng)函數(shù)。上面僅僅是為了說明列表框控件的消息響應(yīng)過程,它可以響應(yīng)單擊、雙擊、右擊、選擇改變等多個(gè)消息。(7)編譯、連接,運(yùn)行結(jié)果如圖8.7所示。圖8.7運(yùn)行結(jié)果分析:上面的例子是列表框控件的常見使用方法,一般情況下,列表框控件經(jīng)常用來進(jìn)行選擇操作。上面的例子首先利用AddString()函數(shù)初始化列表框,然后單擊“確定”按鈕時(shí)根據(jù)所選項(xiàng)得到響應(yīng)的字符串。同時(shí)列表框可以響應(yīng)雙擊、右擊和右鍵雙擊等多個(gè)消息。圖
說明:由于列表項(xiàng)的內(nèi)容一般是不變的,故CListBox未提供更新列表項(xiàng)字符串的函數(shù)。如果要改變某列表項(xiàng)的內(nèi)容,可以先調(diào)用DeleteString()刪除該項(xiàng),然后再用InsertString()或AddString()將更新后的內(nèi)容插入到原來的位置。8.6列表視圖和樹視圖控件列表視圖控件和樹視圖控件是Windows常用的控件類型,在應(yīng)用程序中經(jīng)常用到。例如Windows的資源管理器就是樹視圖控件的典型應(yīng)用。應(yīng)用列表視圖控件和樹視圖控件可以使應(yīng)用程序更加美觀和實(shí)用。8.6.1列表視圖控件的構(gòu)成列表控件可以看做是功能增強(qiáng)的ListBox,它提供了4種風(fēng)格,而且可以同時(shí)顯示一列的多種屬性值。MFC中使用CListCtrl類來封裝列表控件的各種操作。通過調(diào)用BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建一個(gè)窗口。dwStyle中可以使用以下4種列表控件的專用風(fēng)格,這4種風(fēng)格決定控件的外觀。LVS_ICON是大圖標(biāo)顯示風(fēng)格。LVS_SMALLICON是小圖標(biāo)顯示風(fēng)格。LVS_LIST是列表顯示風(fēng)格。LVS_REPORT是詳細(xì)報(bào)表顯示風(fēng)格。在使用列表視圖控件前,需要設(shè)置列表控件所使用的圖標(biāo),如果使用大圖標(biāo)顯示風(fēng)格,需要以如下形式調(diào)用:CImageList*
SetImageList(CImageList*
pImageList,LVSIL_NORMAL);如果使用其他3種風(fēng)格顯示而不想顯示圖標(biāo),可以不進(jìn)行任何設(shè)置。否則需要以如下形式調(diào)用:CImageList*SetImageList(CImageList*
pImageList,LVSIL_SMALL);。類CListCtrl定義了對(duì)列表視圖控件的基本操作,其常用函數(shù)如表8.8所示。表8.8
CListCtrl的函數(shù)列表視圖控件提供了多個(gè)消息響應(yīng)函數(shù),提供包括單擊某個(gè)列表項(xiàng)、雙擊、獲得輸入焦點(diǎn)等。利用類向?qū)Э梢苑奖愕亟⑾㈨憫?yīng)函數(shù),在此不再介紹。函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建列表視圖控件COLORREFGetBkColor()const;獲得背景顏色BOOLSetBkColor(COLORREFcr);設(shè)置背景顏色CImageList*GetImageList(intnImageList)const;獲取圖標(biāo)CImageList*SetImageList(CImageList*pImageList,intnImageList);設(shè)置圖標(biāo)intGetItemCount();獲得列表項(xiàng)的數(shù)目DWORDGetItemData(intnItem)const;獲得列表項(xiàng)的數(shù)據(jù)BOOLSetItem(constLV_ITEM*pItem);設(shè)置列表項(xiàng)數(shù)據(jù)intGetColumnWidth(intnCol)const;獲得列表項(xiàng)寬度BOOLSetColumnWidth(intnCol,intcx);設(shè)置列表項(xiàng)寬度COLORREFGetTextColor()const;得到字體顏色BOOLSetTextColor(COLORREFcr);設(shè)置字體顏色COLORREFGetTextBkColor()const;獲得字體背景色BOOLSetTextBkColor(COLORREFcr);設(shè)置字體背景色CStringGetItemText(intnItem,intnSubItem)const;獲得某項(xiàng)的字符串BOOLSetItemText(intnItem,intnSubItem,LPTSTRlpszText);設(shè)置某項(xiàng)的字符串intInsertItem(intnItem,LPCTSTRlpszItem);插入列表項(xiàng)BOOLDeleteItem(intnItem);刪除某一項(xiàng)8.6.2使用列表視圖控件前面介紹了列表視圖控件的一般使用方法,下面結(jié)合實(shí)例講解其使用的具體過程。【示例8.4】創(chuàng)建一個(gè)對(duì)話框應(yīng)用程序,添加列表視圖控件。使用LVS_REPORT樣式,在上面顯示周一到周日的天氣情況。操作步驟如下所述。(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,添加一個(gè)列表視圖控件,其ID為IDC_LIST1。(2)利用類向?qū)榱斜硪晥D控件添加一個(gè)變量m_list;(3)在CTestDlg::OnInitDialog()函數(shù)中編寫代碼如下:上面的代碼是對(duì)對(duì)話框上的列表視圖控件進(jìn)行初始化工作。一般情況下,對(duì)話框上的控件初始化都是在此函數(shù)中進(jìn)行的。(4)編譯、連接,運(yùn)行結(jié)果如圖8.8所示。字體背景色為紅色,視圖為黑色。圖8.8運(yùn)行結(jié)果上面的例子是列表視圖控件的基本使用方法。一般情況下列表視圖控件用來顯示一些統(tǒng)計(jì)信息,列出多個(gè)統(tǒng)計(jì)變量,同時(shí)該控件可以響應(yīng)單擊、雙擊等多個(gè)消息。8.6.3樹視圖控件的構(gòu)成樹視圖控件是Windows中最為常用的控件之一。該控件常用來顯示一個(gè)樹形結(jié)構(gòu)。其中有一個(gè)根節(jié)點(diǎn),稱為根目錄節(jié)點(diǎn)。根目錄節(jié)點(diǎn)之下有多個(gè)子目錄節(jié)點(diǎn)。樹形控件常用來顯示一個(gè)具有樹形結(jié)構(gòu)的組織結(jié)構(gòu)。在MFC中使用CTreeCtrl類來封裝樹形控件的各種操作。CTreeCtrl類的成員函數(shù)Create()可以創(chuàng)建樹視圖控件。該函數(shù)的函數(shù)原型如下:BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);其中各個(gè)參數(shù)的意義如下所述。dwStyle:樹視圖控件的樣式。rect:控件的窗口。pParentWnd:父窗口指針。nID:控件的ID。在上面的參數(shù)中,dwStyle用來指定控件樣式,其常用的取值如下所述。TVS_HASLINES:在父/子節(jié)點(diǎn)之間繪制連線。默認(rèn)不使用此樣式。TVS_LINESATROOT:在根/子節(jié)點(diǎn)之間繪制連線。TVS_HASBUTTONS:在每一個(gè)節(jié)點(diǎn)前添加一個(gè)“+”按鈕。TVS_EDITLABELS:可以對(duì)節(jié)點(diǎn)的字符進(jìn)行編輯。TVS_NOTOOLTIPS:禁止樹視圖控件使用自動(dòng)提示功能。類TreeCtrl定義了對(duì)列表視圖控件的基本操作,常用操作如表8.9所示。表8.9CTreeCtrl的函數(shù)函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建樹視圖控件UINTGetCount();獲得節(jié)點(diǎn)數(shù)目UINTGetIndent();獲得每層縮進(jìn)距離voidSetIndent(UINTnIndent);設(shè)置每層縮進(jìn)距離CImageList*GetImageList(UINTnImage);獲取圖片列表CImageList*SetImageList(CImageList*pImageList,intnImageListType);設(shè)置圖片列表HTREEITEMGetNextItem(HTREEITEMhItem,UINTnCode);獲得下一節(jié)點(diǎn)BOOLItemHasChildren(HTREEITEMhItem);判斷指定節(jié)點(diǎn)是否有子節(jié)點(diǎn)HTREEITEMGetChildItem(HTREEITEMhItem);獲得子節(jié)點(diǎn)HTREEITEMGetNextSiblingItem(HTREEITEMhItem);獲得兄弟節(jié)點(diǎn)HTREEITEMGetParentItem(HTREEITEMhItem);獲得父節(jié)點(diǎn)HTREEITEMGetRootItem();獲得根節(jié)點(diǎn)BOOLGetItem(TVITEM*pItem);獲得指定節(jié)點(diǎn)信息COLORREFSetBkColor(COLORREFclr);設(shè)置背景顏色BOOLDeleteItem(HTREEITEMhItem);刪除節(jié)點(diǎn)BOOLExpand(HTREEITEMhItem,UINTnCode);打開或者折疊節(jié)點(diǎn)CImageList*CreateDragImage(HTREEITEMhItem);創(chuàng)建圖片,且可以進(jìn)行拖放BOOLSortChildren(HTREEITEMhItem);排序子節(jié)點(diǎn)上面對(duì)樹視圖控件的基本函數(shù)進(jìn)行了介紹。通過創(chuàng)建一個(gè)控件對(duì)象,可以方便地對(duì)樹視圖控件進(jìn)行操作。下面介紹樹視圖控件的消息映射。樹形控件的消息映射使用ON_NOTIFY宏,形式如同ON_NOTIFY(wNotifyCode,id,memberFxn),wNotifyCode為通知代碼,id為產(chǎn)生該消息的窗口ID,memberFxn為處理函數(shù)。函數(shù)的原型如同voidOnXXXTree(NMHDR*
pNMHDR,LRESULT*
pResult),其中pNMHDR為一數(shù)據(jù)結(jié)構(gòu),在具體使用時(shí)需要轉(zhuǎn)換成其他類型的結(jié)構(gòu)。利用類向?qū)Э梢苑奖愕剡M(jìn)行消息映射,在此不再敘述。
說明:樹視圖控件是Windows下最為常用的控件之一,例如資源管理器的左側(cè)部分就是一個(gè)樹視圖控件。讀者應(yīng)了解該控件的常用場(chǎng)合。8.6.4使用樹視圖控件前面介紹了樹視圖的基本知識(shí),下面結(jié)合實(shí)例介紹其使用方法。【示例8.5】創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,添加樹視圖控件,顯示一個(gè)學(xué)校的組織結(jié)構(gòu)。操作步驟如下所述。(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,添加一個(gè)樹視圖控件。(2)設(shè)置樹視圖控件的屬性,在TreeControlProperties對(duì)話框中,選擇Styles標(biāo)簽,選擇其中的Hasbuttons、Haslines和Linesatroot復(fù)選框,如圖8.9所示。圖8.9設(shè)置樹視圖控件的屬性(3)在資源編輯器中添加3個(gè)圖標(biāo)資源。(4)在CTestDlg中添加數(shù)據(jù)成員CImageListm_imageList;。(5)在CTestDlg::OnInitDialog()添加代碼如下:分析:可以看到InsertItem()函數(shù)是進(jìn)行顯示的重點(diǎn),但是其插入項(xiàng)的樣式及位置等信息則需要利用TV_INSERTSTRUCT類型的參數(shù)決定。下面對(duì)該結(jié)構(gòu)進(jìn)行介紹。TV_INSERTSTRUCT結(jié)構(gòu)的主要成員包括下面幾項(xiàng)。hParent:父節(jié)點(diǎn)項(xiàng)的句柄,如果取值為NULL則為第一項(xiàng)。hInsertAfter:表示插入的下一層位置,取值為TVI_LAST表示插入最后一個(gè)位置,TVI_FIRST表示插入第一個(gè)位置,TVI_SORT表示按字母排序插入。item:具體插入項(xiàng)的數(shù)據(jù),是一個(gè)TV_ITEM類型的數(shù)據(jù)。TV_ITEM的結(jié)構(gòu)成員如下所述。mask:指定某些成員有效,進(jìn)行“|”運(yùn)算指定有效項(xiàng),具體情況如下所述。TVIF_CHILDREN:cChildren有效。TVIF_HANDLE:hItem有效。TVIF_IMAGE:iImage有效。TVIF_PARAM:lParam有效。TVIF_SELECTEDIMAGE:iSelectedImage有效。TVIF_STATE:state和stateMask有效。TVIF_TEXT:pszText和cchTextMax有效。hItem:該項(xiàng)的句柄。state:表示當(dāng)前項(xiàng)的狀態(tài)。lParam:用戶指定的數(shù)據(jù)。pszText:該項(xiàng)的文字。cchTextMax:pszText緩沖區(qū)的長(zhǎng)度。iSelectedImage:該項(xiàng)選中時(shí)的圖標(biāo)。stateMask:state的掩碼。iImage:該項(xiàng)的圖標(biāo)。cChildren:指定該項(xiàng)是否有子節(jié)點(diǎn)。(6)編譯、連接,運(yùn)行結(jié)果如圖8.10所示。圖8.10運(yùn)行結(jié)果上例是樹視圖控件的基本使用方法的介紹,樹視圖控件是一種常用的控件。例如Windows自帶的注冊(cè)表編輯器就是使用樹視圖控件,還有Windows的資源管理器也是樹視圖控件的使用例子。樹視圖控件與數(shù)據(jù)結(jié)構(gòu)中的樹結(jié)構(gòu)有很大的相似之處。應(yīng)用中,只要搞清楚父節(jié)點(diǎn)與子節(jié)點(diǎn)的關(guān)系就可以很快地設(shè)計(jì)出樹視圖控件。樹視圖控件與一般的控件一樣,它可以響應(yīng)單擊、雙擊等多個(gè)消息,利用類向?qū)Э梢苑奖愕靥砑痈鱾€(gè)消息映射。8.7編輯框控件編輯框控件是用來接收用戶輸入最常用的一個(gè)控件,是Windows的標(biāo)準(zhǔn)控件之一。在應(yīng)用程序中經(jīng)常利用編輯框來獲取用戶的輸入信息。本節(jié)介紹編輯框控件的基本屬性應(yīng)用。8.7.1編輯框的構(gòu)成MFC對(duì)編輯框控件進(jìn)行了封裝,它所對(duì)應(yīng)的類為CEdit類。CEdit類是直接從CWnd派生來的類。在CEdit了中封裝了對(duì)編輯框的所有操作。編輯框又分為單行編輯框和多行編輯框。同時(shí)編輯框控件的基本屬性可以設(shè)置編輯框?yàn)槊艽a輸入。熟悉和掌握編輯框的基本使用是非常重要的。一般來說,編輯框控件的操作分為通用操作和多行操作,下面分別進(jìn)行介紹。1.通用方法通用方法可以對(duì)單行和多行編輯框適用。常見的通用方法如表8.10所示。表8.10CEdit的通用方法函
數(shù)說
明DWORDGetSel()const;獲得編輯框當(dāng)前開始和結(jié)束字符位置voidSetSel(DWORDdwSelection,BOOLbNoScroll=FALSE);選擇字符的范圍voidClear();刪除當(dāng)前的選擇voidCopy();將編輯框內(nèi)容復(fù)制到剪貼板中voidCut();將編輯框內(nèi)容剪切到剪貼板中voidPaste();將剪貼板內(nèi)容復(fù)制到編輯框中BOOLUndo();撤銷操作BOOLCanUndo()const;決定編輯框是否可以撤銷操作voidEmptyUndoBuffer();清除編輯框的撤銷標(biāo)志BOOLGetModify()const;設(shè)置編輯框內(nèi)容是否可以修改voidSetModify(BOOLbModified=TRUE);設(shè)置編輯框的修改標(biāo)志BOOLSetReadOnly(BOOLbReadOnly=TRUE);設(shè)置編輯框?yàn)橹蛔xTCHARGetPasswordChar()const;編輯框顯示為密碼intLineLength(intnLine=–1)const;獲得編輯框的長(zhǎng)度voidLineScroll(intnLines,intnChars=0);滾動(dòng)多行編輯框intLineFromChar(intnIndex=–1)const;獲得包含指定字符下標(biāo)的行號(hào)voidGetRect(LPRECTlpRect)const;得到編輯框窗口的矩形voidLimitText(intnChars=0);限制編輯框輸入長(zhǎng)度2.多行編輯框操作方法多行編輯框有自己特殊的操作,它支持在編輯框窗口中進(jìn)行多行編輯。其常用操作如表8.11所示。表8.11多行編輯框的操作方法
說明:多行編輯框是從0開始編行號(hào)的。在多行編輯框中,除了最后一行外,每一行的結(jié)尾處都有一對(duì)回車換行符(用"\r\n"表示)。程序員可以在字符串中添加回車換行符進(jìn)行換行。函
數(shù)說
明intGetLineCount()const;獲得多行編輯框的行數(shù)intGetLine(intnIndex,LPTSTRlpszBuffer)const;獲得某一行的文本intLineIndex(intnLine=–1)const;設(shè)置某一行的字符的下標(biāo)voidSetTabStops();設(shè)置制表鍵voidSetRect(LPCRECTlpRect);設(shè)置編輯框控件的格式化矩形HLOCALGetHandle()const;獲得編輯框控件的句柄voidSetHandle(HLOCALhBuffer);設(shè)置編輯框句柄8.7.2使用編輯框編輯框控件通過發(fā)送WM_COMMAND消息通知應(yīng)用程序,利用類向?qū)Э梢苑奖愕靥砑酉㈨憫?yīng)函數(shù)。下面結(jié)合例子說明編輯框控件的一般程序設(shè)計(jì)步驟?!臼纠?.6】在對(duì)話框中添加兩個(gè)多行的編輯框控件和一個(gè)按鈕控件。在其中一個(gè)輸入一行字符串,單擊“顯示”按鈕,在另一個(gè)編輯框中顯示出來,并且將原來的編輯框內(nèi)容清空。操作步驟如下所述。(1)創(chuàng)建基于對(duì)話框的應(yīng)用程序。(2)添加兩個(gè)編輯框控件和一個(gè)按鈕控件,將按鈕控件標(biāo)題設(shè)置為“顯示”,并且將兩個(gè)編輯框的屬性設(shè)置為多行。具體設(shè)置方法是,右擊編輯框控件。在彈出的快捷菜單中選擇Properties命令,彈出EditProperties對(duì)話框。選擇Styles標(biāo)簽,在其選項(xiàng)中選中復(fù)選框如圖8.11所示。圖8.11屬性設(shè)置說明:上面的屬性設(shè)置為多行對(duì)話框,有垂直滾動(dòng)條和橫向滾動(dòng)條。(3)為兩個(gè)編輯框添加控制型變量m_edit1,m_edit2。(4)利用類向?qū)砑訂螕簟帮@示”按鈕的消息響應(yīng)函數(shù)。編寫函數(shù)體如下:(5)編譯、連接,運(yùn)行效果如圖8.12和圖8.13所示。上面是編輯框控件的使用例子。編輯框控件是應(yīng)用程序中最為常見的控件之一,一般情況下,編輯框用來接收數(shù)據(jù)或者輸出數(shù)據(jù)。圖8.12編輯框1中輸入內(nèi)容圖8.13單擊“顯示”按鈕8.8組合框控件組合框控件是Windows常用控件之一,它經(jīng)常為用戶提供選項(xiàng)供用戶選擇。它是輸入框和列表框的結(jié)合體,這種控件的復(fù)合性使得其應(yīng)用范圍非常廣泛。下面對(duì)組合框控件的類及其使用進(jìn)行介紹。8.8.1組合框控件的構(gòu)成在MFC中,類CComboBox對(duì)組合框控件進(jìn)行封裝。CComboBox是一個(gè)直接從CWnd派生來的類,因此它包含了CWnd的所有功能。類中常用的函數(shù)如表8.12所示。表8.12
CComboBox類的常見成員上面列出了組合框的常用函數(shù),在實(shí)際的應(yīng)用中,可以利用類向?qū)砑右粋€(gè)對(duì)象,然后對(duì)組合框控件進(jìn)行操作。函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID)創(chuàng)建組合框控件intGetCount()const;得到組合框的選項(xiàng)數(shù)目intGetCurSel()const;得到用戶選擇的項(xiàng)intSetCurSel(intnSelect);設(shè)置默認(rèn)選擇哪一項(xiàng)voidClear();清除所選的項(xiàng)voidCopy();復(fù)制所選的項(xiàng)voidCut();剪切所選的項(xiàng)voidPaste();將剪貼板內(nèi)容粘貼到光標(biāo)處BOOLLimitText(intnMaxChars);限制輸入字符串長(zhǎng)度intSetItemHeight(intnIndex,UINTcyItemHeight);設(shè)置選項(xiàng)的高度intAddString(LPCTSTRlpszString);往組合框中添加項(xiàng)intDeleteString(UINTnIndex);刪除某一項(xiàng)intInsertString(intnIndex,LPCTSTRlpszString);插入一項(xiàng)intFindString(intnStartAfter,LPCTSTRlpszString)const;查找某個(gè)字符串intSelectString(intnStartAfter,LPCTSTRlpszString);查找并選擇某個(gè)字符串intGetLBText(intnIndex,LPTSTRlpszText)const;voidGetLBText(intnIndex,CString&rString)const;得到某一項(xiàng)的文本8.8.2設(shè)置組合框在實(shí)際的使用過程中,利用資源編輯工具添加組合框控件以后,需要正確設(shè)置其屬性才可以在應(yīng)用程序中正確使用該控件。下面對(duì)常用的屬性設(shè)置進(jìn)行介紹。1.大小設(shè)置組合框的大小的設(shè)置與一般的控件不太相同。一般的控件調(diào)整大小只要選中該控件,然后在邊框處按下鼠標(biāo)拖動(dòng)就可以了,這樣的操作只可以改變組合框的橫向大小。如果需要改變組合框的下拉選項(xiàng)的大小,那么則需要單擊該組合框控件,然后將鼠標(biāo)移動(dòng)到下拉按鈕上,單擊鼠標(biāo),會(huì)出現(xiàn)一個(gè)邊框,如圖8.14所示。此時(shí)用鼠標(biāo)拖動(dòng)就可以改變縱向的大小。2.選項(xiàng)的輸入有時(shí)對(duì)組合框選項(xiàng)的初始化可以在程序則中利用intAddString(LPCTSTRlpszString);函數(shù)動(dòng)態(tài)地添加。但是如果整個(gè)程序運(yùn)行中選項(xiàng)不變,則可以在“Properties”對(duì)話框中進(jìn)行添加。方法為右擊組合框,在彈出的快捷菜單中選擇Properties命令,彈出Combo
BoxProperties對(duì)話框。選擇Data標(biāo)簽,如圖8.15所示。在編輯框控件中輸入選項(xiàng),每一行對(duì)應(yīng)組合框的一個(gè)選項(xiàng)。
注意:輸入數(shù)據(jù)時(shí),每輸入一項(xiàng)后,按Ctrl+Enter組合鍵可換到下一行繼續(xù)輸入。此時(shí)按下Enter鍵會(huì)退出ComboBoxProperties對(duì)話框,而不能換行。圖8.14單擊顯示圖圖8.15ComboBoxProperties對(duì)話框3.組合框的類型組合框的類型有3種分別是Simple、DropDown和DropList。其中Simple類型只是包含一個(gè)編輯框和列表框;DropDown類型可以單擊下三角按鈕進(jìn)行選項(xiàng)選擇,也可在編輯框中輸入文本,這是組合框的默認(rèn)類型;DropList類型只能單擊下三角按鈕進(jìn)行選擇,編輯框無法進(jìn)行輸入。這3種類型分別如圖8.16、圖8.17和圖8.18所示。圖8.16Simple類型組合框圖8.17DropDown類型組合框圖8.18DropList類型組合框4.其他屬性在前面的ComboBoxProperties對(duì)話框中還可以對(duì)組合框的其他屬性進(jìn)行設(shè)置。例如在Styles屬性頁里面可以選中Sort屬性,這時(shí)可以對(duì)組合框選項(xiàng)進(jìn)行排序。8.8.3組合框的消息傳遞MFC中封裝了對(duì)許多消息的響應(yīng),組合框可以對(duì)一些常見的消息進(jìn)行響應(yīng),例如用戶單擊某個(gè)選項(xiàng)、組合框失去輸入焦點(diǎn)等。利用類向?qū)Э梢苑奖愕靥砑酉㈨憫?yīng)函數(shù),然后程序員只需要編寫相應(yīng)的處理程序就可以了。在此不再進(jìn)行介紹。8.9Tab屬性頁控件Tab屬性頁控件是Windows中較為常用的控件之一,它在一個(gè)對(duì)話框上可以利用標(biāo)簽來分別彈出不同的屬性頁。本節(jié)介紹在VisualC++中屬性頁控件的基本使用方法。8.9.1Tab屬性頁的構(gòu)成在MFC中,類CTabCtrl對(duì)屬性頁控件進(jìn)行封裝,CTabCtrl是一個(gè)直接從CWnd派生來的類,因此它包含了CWnd的所有功能。CTabCtrl類中常用的函數(shù)如表8.13所示。表8.13CTabCtrl的常見成員上面列出了組合框的常用函數(shù),在實(shí)際的應(yīng)用中,可以利用類向?qū)砑右粋€(gè)對(duì)象,然后對(duì)組合框控件進(jìn)行操作。函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建屬性頁控件BOOLInsertItem(intnItem,TCITEM*pTabCtrlItem);BOOLInsertItem(intnItem,LPCTSTRlpszItem);BOOLInsertItem(intnItem,LPCTSTRlpszItem,intnImage);BOOLInsertItem(UINTnMask,intnItem,LPCTSTRlpszItem,intnImage,LPARAMlParam);插入屬性頁標(biāo)簽BOOLDeleteAllItems();刪除所有標(biāo)簽intGetCurSel()const;獲取當(dāng)前選中的標(biāo)簽intSetCurSel(intnItem);設(shè)置當(dāng)前標(biāo)簽BOOLGetItemState(intnItem,DWORDdwMask,DWORD&dwState)const;獲取某個(gè)標(biāo)簽的狀態(tài)BOOLSetItemState(intnItem,DWORDdwMask,DWORDdwState);設(shè)置某個(gè)標(biāo)簽的狀態(tài)8.9.2使用屬性頁屬性頁的每一個(gè)標(biāo)簽下面都是一個(gè)對(duì)話框,也就是說屬性頁控件僅僅是把對(duì)話框顯示出來。每個(gè)對(duì)話框可以單獨(dú)地處理自己的控件消息。下面結(jié)合實(shí)例講解屬性頁控件的使用?!臼纠?.7】在對(duì)話框上添加屬性頁控件,然后分別綁定兩個(gè)對(duì)話框,可以響應(yīng)單擊標(biāo)簽消息,分別顯示對(duì)應(yīng)的對(duì)話框。分析:一個(gè)屬性頁控件利用函數(shù)綁定對(duì)話框,然后響應(yīng)切換屬性頁或者說是單擊標(biāo)簽的消息進(jìn)行對(duì)話框的顯示,具體步驟如下。(1)利用向?qū)?chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)在對(duì)話框資源上添加一個(gè)屬性頁控件,其ID為IDC_TAB。并且利用類向?qū)樵摽丶砑幼兞緾TabCtrl
m_tab;。(3)利用資源編輯器添加兩個(gè)對(duì)話框資源,并且設(shè)置對(duì)話框資源的屬性,如圖8.19所示。圖8.19設(shè)置對(duì)話框?qū)傩陨厦娴膶傩栽O(shè)置說明去掉對(duì)話框的標(biāo)題,同時(shí)設(shè)置其樣式為Child樣式。注意:必須將對(duì)話框的樣式設(shè)置為Child樣式,否則對(duì)話框不能顯示。(4)利用類向?qū)閮蓚€(gè)對(duì)話框添加類CDialog1和CDialog2。(5)在CTestDlg類的聲明文件中包含兩個(gè)對(duì)話框類的頭文件,如下所示。#include"Dialog1.h"#include"Dialog2.h"在CTestDlg類中添加兩個(gè)成員變量,如下所示。CDialog1dlg1;
//定義對(duì)象CDialog2dlg2;
//定義對(duì)象(6)在CTestDlg::OnInitDialog()中添加屬性頁控件的初始化語句,同時(shí)綁定兩個(gè)對(duì)話框。代碼如下:分析:上面的代碼首先插入屬性頁標(biāo)簽,但并不是真正地插入屬性頁。然后創(chuàng)建了兩個(gè)以屬性頁為父窗口的對(duì)話框,并且利用MoveWindow()函數(shù)將對(duì)話框移動(dòng)到屬性頁的窗口上。最后顯示一個(gè)對(duì)話框。(7)上面雖然創(chuàng)建了標(biāo)簽,但在切換時(shí)并不能真正地切換出對(duì)話框(為了顯示兩個(gè)對(duì)話框的不同,可以移動(dòng)一個(gè)對(duì)話框上的按鈕位置)。為了響應(yīng)切換屬性頁的消息,可以利用類向?qū)砑覶CN_SELCHANGE消息和TCN_SECHANGING消息,前者是切換回發(fā)出的消息,后者是切換中發(fā)出的消息。利用類向?qū)砑覶CN_SELCHANGE消息映射,添加函數(shù)OnSelchangeTab(),編寫函數(shù)代碼如下:利用上面的代碼實(shí)現(xiàn)切換屬性頁時(shí)顯示不同的對(duì)話框。(8)編譯、連接,運(yùn)行結(jié)果如圖8.20所示,選擇屬性頁后,結(jié)果如圖8.21所示。圖8.20運(yùn)行結(jié)果圖8.21屬性頁切換上面介紹了屬性頁控件的一般使用方法。一般情況下,屬性頁的對(duì)話框不需要OK或者Cancel按鈕,因?yàn)橥顺龊?,上面顯示一片空白。實(shí)際應(yīng)用中可以根據(jù)程序需要選擇該控件的使用。
說明:一般來說屬性頁的子對(duì)話框是進(jìn)行程序設(shè)計(jì)的主要處理對(duì)話框,主對(duì)話框僅僅是放在屬性頁控件。每個(gè)屬性頁標(biāo)簽下的對(duì)話框都是一個(gè)完整的對(duì)話框,可以進(jìn)行消息處理。8.10其他常用控件在Windows中,除了前面介紹的控件以外,還有許多常用的控件。例如進(jìn)度條控件、時(shí)間控件等。本節(jié)對(duì)其中常用的控件進(jìn)行介紹。8.10.1進(jìn)度條控件在Windows的安裝程序或者其他程序中經(jīng)常利用進(jìn)度條控件顯示程序運(yùn)行進(jìn)程。在MFC中利用CProgressCtrl類對(duì)進(jìn)度條控件進(jìn)行了封裝。其中常見的函數(shù)如表8.14所示。表8.14CProgressCtrl類的常見成員使用過程中可以在對(duì)話框中添加一個(gè)進(jìn)度條控件,然后創(chuàng)建一個(gè)指向該進(jìn)度條的對(duì)象指針。在應(yīng)用程序中可以利用類中的函數(shù)對(duì)進(jìn)度條控件進(jìn)行操作。進(jìn)度條控件的使用一般需要利用一個(gè)時(shí)間計(jì)數(shù)器進(jìn)行定時(shí)來實(shí)現(xiàn)進(jìn)度條的前進(jìn)。函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建進(jìn)度條控件voidSetRange(shortnLower,shortnUpper);設(shè)置進(jìn)度條表示范圍intSetPos(intnPos);設(shè)置當(dāng)前位置intSetStep(intnStep);設(shè)置漸進(jìn)步長(zhǎng)intStepIt();前進(jìn)一步8.10.2滑塊控件滑塊控件是可以讓用戶通過拖動(dòng)滑塊來快速獲得數(shù)據(jù)的控件。當(dāng)用戶拖動(dòng)滑塊時(shí),空間將發(fā)送消息給應(yīng)用程序。在MFC中,CSliderCtrl類對(duì)滑塊控件進(jìn)行了封裝。其常見成員如表8.15所示。表8.15CSliderCtrl類的常見成員當(dāng)利用鼠標(biāo)拖動(dòng)滑塊控件時(shí),可以添加消息響應(yīng)函數(shù)來處理這一消息。函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建滑塊控件voidSetRange(intnMin,intnMax,BOOLbRedraw=FALSE);設(shè)置滑塊的表示范圍voidSetPos(intnPos);設(shè)置當(dāng)前位置intGetPos()const;獲得當(dāng)前位置voidSetSelection(intnMin,intnMax);設(shè)置選取范圍8.10.3IPAddress控件在網(wǎng)絡(luò)類應(yīng)用程序中,經(jīng)常需要對(duì)IP地址進(jìn)行處理。而IP地址控件是一個(gè)四段型的標(biāo)準(zhǔn)IP地址的形式,用戶可以以點(diǎn)分十進(jìn)制形式輸入IP地址。IP地址是一個(gè)32位的二進(jìn)制數(shù)據(jù),實(shí)際中常用的形式是點(diǎn)分十進(jìn)制形式,例如119.232.11.34。而IPAddress控件就是這樣一個(gè)標(biāo)準(zhǔn)形式。MFC中利用CIPAddressCtrl類對(duì)IPAddress控件進(jìn)行了封裝,CIPAddressCtrl是直接由類CWnd派生,因此它繼承了CWnd的全部功能。其中CIPAddressCtrl類常見的成員如表8.16所示。表8.16CSliderCtrl類的常見成員在網(wǎng)絡(luò)類程序中,經(jīng)常利用IPAddress控件進(jìn)行地址輸入,掌握和了解該控件的使用有助于后面開發(fā)網(wǎng)絡(luò)應(yīng)用程序。在此不再介紹。函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建IPAddress控件BOOLIsBlank()const;查看IP是否為空voidClearAddress();清空IP地址intGetAddress(BYTE&nField0,BYTE&nField1,BYTE&nField2,BYTE&nField3);intGetAddress(DWORD&dwAddress);獲得IP地址voidSetAddress(BYTEnField0,BYTEnField1,BYTEnField2,BYTEnField3);voidSetAddress(DWORDdwAddress);設(shè)置IP地址8.10.4時(shí)間控件在應(yīng)用程序中經(jīng)常需要對(duì)時(shí)間進(jìn)行輸入,而如果以字符串的形式輸入則處理起來十分復(fù)雜。在VisualC++中提供了兩個(gè)專門進(jìn)行時(shí)間顯示的控件DateTimePicker和MonthCalendar控件。這兩個(gè)控件可以用來接收時(shí)間的輸入或者輸出。在MFC中使用CDateTimeCtrl類和CMonthCalCtrl類對(duì)該控件進(jìn)行了封裝。DateTimePicker控件與MonthCalendar控件有很多相同之處,DateTimePickerk可以看做是一個(gè)組合框控件和MonthCalendar控件的合成體。單擊DateTimePickerk控件上的組合框的下三角按鈕時(shí)會(huì)彈出一個(gè)MonthCalendar控件,而組合框中的編輯框內(nèi)顯示的是日期。CDateTimeCtrl類和CMonthCalCtrl類都是從CWnd派生出來的類。它們分別封裝了DateTimePicker和MonthCalendar控件的各種操作和屬性。MonthCalendar控件是用來顯示一個(gè)月的日期的控件,稱為日歷控件。在該控件上顯示了當(dāng)前一個(gè)月的日期和星期。這樣使得其界面更加美觀,在MFC中使用CMonthCalCtrl類封裝了對(duì)該控件的操作。其主要的成員函數(shù)如表8.17所示。表8.17CSliderCtrl類的常見成員函
數(shù)說
明BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);BOOLCreate(DWORDdwStyle,constPOINT&pt,CWnd*pParentWnd,UINTnID);創(chuàng)建一個(gè)日歷控件BOOLCMonthCalCtrl::GetToday(COleDateTime&refDateTime)const;BOOLCMonthCalCtrl::GetToday(CTime&refDateTime)const;BOOLGetToday(LPSYSTEMTIMEpDateTime)const;得到今天的日期BOOLSetRange(constCOleDateTime*pMinRange,constCOleDateTime*pMaxRange);BOOLSetRange(constCTime*pMinRange,constCTime*pMaxRange);BOOLSetRange(constLPSYSTEMTIMEpMinRange,constLPSYSTEMTIMEpMaxRange);設(shè)置顯示的日期范圍COLORREFSetColor(intnRegion,COLORREFref);設(shè)置控件的顏色BOOLGetCurSel(COleDateTime&refDateTime)const;BOOLGetCurSel(CTime&refDateTime)const;BOOLGetCurSel(LPSYSTEMTIMEpDateTime)const;得到用戶選擇的日期CMonthCalCtrl類封裝了對(duì)日歷控件的操作。當(dāng)用戶單擊該控件上的日期時(shí)會(huì)產(chǎn)生消息,包括選中和改變選擇兩個(gè)消息。MCN_SELECTCHANGE:用戶選擇改變。MCN_SELECT:用戶選擇了一個(gè)日期。注意:CMonthCalCtrl控件在初始化時(shí)會(huì)自動(dòng)得到當(dāng)前的日期,因此程序員不必對(duì)該控件顯示當(dāng)前日期進(jìn)行處理。DateTimePickerk是一個(gè)組合框控件和MonthCalendar控件的合成體。單擊DateTimePickerk控件上的組合框的下三角按鈕時(shí)會(huì)彈出一個(gè)MonthCalendar控件,而組合框中的編輯框內(nèi)顯示的是日期。在MFC中使用CDateTimeCtrl類對(duì)DateTimePickerk的操作和屬性進(jìn)行了封裝。該類的主要成員如表8.18所示。表8.18CDateTimeCtrl類的常見成員函
數(shù)說
明CDateTimeCtrl();構(gòu)造函數(shù)BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);創(chuàng)建日期控件COLORREFGetMonthCalColor(intiColor)const;獲得內(nèi)嵌日歷控件的顏色COLORREFSetMonthCalColor(intiColor,COLORREFref);設(shè)置內(nèi)嵌日歷控件的顏色BOOLSetFormat(LPCTSTRpstrFormat);設(shè)置日期格式CMonthCalCtrl*GetMonthCalCtrl()const;獲取內(nèi)嵌日歷控件的指針BOOLSetRange(constCOleDateTime*pMinRange,constCOleDateTime*pMaxRange);BOOLSetRange(constCTime*pMinRange,constCTime*pMaxRange);設(shè)置日期范圍BOOLSetTime(constCOleDateTime&timeNew);BOOLSetTime(const
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 嬰兒用安撫奶嘴產(chǎn)品供應(yīng)鏈分析
- 抽氣機(jī)產(chǎn)品供應(yīng)鏈分析
- 紙禮品袋商業(yè)機(jī)會(huì)挖掘與戰(zhàn)略布局策略研究報(bào)告
- 藥用苯酚項(xiàng)目營(yíng)銷計(jì)劃書
- 廢棄建筑材料回收利用行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 廢紙籃產(chǎn)品供應(yīng)鏈分析
- 微生物除臭劑行業(yè)營(yíng)銷策略方案
- 增強(qiáng)現(xiàn)實(shí)(AR)游戲行業(yè)相關(guān)項(xiàng)目經(jīng)營(yíng)管理報(bào)告
- 地板蠟清除劑刷凈劑產(chǎn)品供應(yīng)鏈分析
- 汽化器產(chǎn)品供應(yīng)鏈分析
- 年會(huì)禮品選擇的調(diào)研分析
- BUNN 咖啡機(jī) 培訓(xùn)指南(Axiom-3 )
- 朝鮮戰(zhàn)爭(zhēng)完整版本
- 我國(guó)的宗教政策(共37張)
- 降低kV配電線路故障停運(yùn)率的有效措施
- 中藥材項(xiàng)目商業(yè)計(jì)劃書
- 醫(yī)療核心制度執(zhí)行情況自查表
- 藥學(xué)職業(yè)生涯人物訪談報(bào)告(6篇)
- 砌筑腳手架施工方案(有計(jì)算)
- 2023-2024學(xué)年浙江省山海聯(lián)盟協(xié)作學(xué)校八年級(jí)(上)期中數(shù)學(xué)試卷
- 《10以內(nèi)數(shù)的加減混合運(yùn)算》說課稿子
評(píng)論
0/150
提交評(píng)論