VisualC++常用控件-第5章_第1頁
VisualC++常用控件-第5章_第2頁
VisualC++常用控件-第5章_第3頁
VisualC++常用控件-第5章_第4頁
VisualC++常用控件-第5章_第5頁
已閱讀5頁,還剩111頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章常用控件5.1創(chuàng)建和使用控件5.2靜態(tài)控件和按鈕5.3編輯框和旋轉(zhuǎn)按鈕控件5.4列表框5.5組合框5.6進(jìn)展條、滾動(dòng)條和滑動(dòng)條5.7日期控件和計(jì)時(shí)器5.1創(chuàng)建和使用控件5.1.1控件的創(chuàng)建方式5.1.1控件的創(chuàng)建方式(3)將項(xiàng)目工作區(qū)切換到ClassView頁面,展開Ex_Create所有的類節(jié)點(diǎn),右擊CEx_CreateDlg類名,彈出如圖5.1所示的快捷菜單。5.1.1控件的創(chuàng)建方式從快捷菜單中選擇AddMemberVariable(添加成員變量),出現(xiàn)如圖5.2所示的對(duì)話框,在變量類型(VariableType)編輯框中輸入CButton(MFC按鈕類),在變量名稱(VariableName)編輯框中輸入要定義的CButton類對(duì)象名m_btnWnd。5.1.1控件的創(chuàng)建方式(4)在項(xiàng)目工作區(qū)窗口的ClassView頁面中,將CEx_CreateDlg節(jié)點(diǎn)展開,雙擊OnInitDialog函數(shù)名,在該函數(shù)中添加下列代碼(在returnTRUE;語句之前添加):BOOLCEx_CreateDlg::OnInitDialog(){ CDialog::OnInitDialog(); //…

m_btnWnd.Create("你好",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_TABSTOP, CRect(20,20,120,40),this,201); //創(chuàng)建 CFont*font=this->GetFont(); //獲取對(duì)話框的字體 m_btnWnd.SetFont(font); //設(shè)置控件字體

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}5.1.1控件的創(chuàng)建方式(5)編譯并運(yùn)行,結(jié)果如圖5.3所示。5.1.2控件的消息及消息映射1.映射控件消息不管是什么控件消息,一般都可以用MFCClassWizard對(duì)它們加以映射。例如下面的示例過程:(1)將項(xiàng)目工作區(qū)窗口切換到ResourseView頁面,雙擊Dialog資源下的標(biāo)識(shí)符IDD_EX_CREATE_DIALOG,打開Ex_Create項(xiàng)目的對(duì)話框資源模板。(2)選中“TODO:在這里設(shè)置對(duì)話控制。”控件,按【Delete】鍵刪除。從控件工具箱中拖放添加一個(gè)按鈕控件,如圖5.4所示,保留其默認(rèn)屬性。5.1.2控件的消息及消息映射(3)按快捷鍵【Ctrl+W】,打開MFCClassWizard對(duì)話框,查看“Classname”列表中是否選擇了CEx_CreateDlg,在ObjectIDs列表中選擇IDC_BUTTON1。(4)單擊 按鈕或雙擊BN_CLICKED消息,出現(xiàn)“AddMemberFunction”對(duì)話框,在這里可以輸入成員函數(shù)的名稱,系統(tǒng)默認(rèn)的函數(shù)名為OnButton1,如圖5.5所示。5.1.2控件的消息及消息映射(5)雙擊消息函數(shù)OnButton1或單擊 按鈕,MFCClassWizard對(duì)話框退出,并轉(zhuǎn)向文檔窗口,定位到CEx_CreateDlg::OnButton1函數(shù)實(shí)現(xiàn)的源代碼處,添加下列代碼:voidCEx_CreateDlg::OnButton1(){ MessageBox(_T("你按下了\"Button1\"按鈕!"));}(6)編譯并運(yùn)行,當(dāng)單擊 按鈕時(shí),就會(huì)執(zhí)行OnButton1函數(shù),彈出一個(gè)消息對(duì)話框,顯示“ ”內(nèi)容。5.1.2控件的消息及消息映射2.映射控件通用消息(1)按快捷鍵【Ctrl+W】,打開MFCClassWizard對(duì)話框,查看“Classname”列表中是否選擇了CEx_CreateDlg,在ObjectIDs列表中選擇CEx_CreateDlg,在Messages框中找到并雙擊OnCommand,這樣OnCommand消息函數(shù)就添加好了,如圖5.6所示。5.1.2控件的消息及消息映射(2)雙擊消息函數(shù)OnCommand或單擊

按鈕,MFCClassWizard對(duì)話框退出,并轉(zhuǎn)向文檔窗口,定位到CEx_CreateDlg::OnCommand函數(shù)實(shí)現(xiàn)的源代碼處,添加下列代碼:BOOLCEx_CreateDlg::OnCommand(WPARAMwParam,LPARAMlParam){

WORDnCode=HIWORD(wParam); //控件的通知消息 WORDnID =LOWORD(wParam); //控件的ID if((nID==201)&&(nCode==BN_CLICKED)) MessageBox(_T("你按下了\"你好\"按鈕!")); if((nID==IDC_BUTTON1)&&(nCode==BN_CLICKED)) MessageBox(_T("這是在OnCommand處理的結(jié)果!")); returnCDialog::OnCommand(wParam,lParam);}5.1.3控件類和控件對(duì)象表5.1列出了MFC封裝的常用控件類。控件名稱MFC類功能描述靜態(tài)控件CStatic用來顯示一些幾乎固定不變的文字或圖形按鈕CButton用來產(chǎn)生某些命令或改變某些選項(xiàng),包括單選按鈕、復(fù)選框和組合框編輯框CEdit用于完成文本和數(shù)字的輸入和編輯列表框CListBox顯示一個(gè)列表,讓用戶從中選取一個(gè)或多個(gè)項(xiàng)組合框CComboBox是一個(gè)列表框和編輯框組合的控件滾動(dòng)條CScrollBar通過滾動(dòng)塊在滾動(dòng)條上的移動(dòng)和滾動(dòng)按鈕來改變某些量進(jìn)展條CProgressCtrl用來表示一個(gè)操作的進(jìn)度滑動(dòng)條CSliderCtrl通過滑動(dòng)塊的移動(dòng)來改變某些量,并帶有刻度指示旋轉(zhuǎn)按鈕控件CSpinButtonCtrl帶有一對(duì)反向箭頭的按鈕,單擊這對(duì)按鈕可增大或減小某個(gè)值日期時(shí)間控件CDateTimeCtrl用于選擇指定的日期和時(shí)間圖像列表CImageList一個(gè)具有相同大小的圖標(biāo)或位圖的集合標(biāo)簽控件CTabCtrl類似于一個(gè)筆記本的分隔器或一個(gè)文件柜上的標(biāo)簽,使用它可以將一個(gè)窗口或?qū)υ捒虻南嗤瑓^(qū)域定義為多個(gè)頁面5.1.3控件類和控件對(duì)象在MFC中,獲取一個(gè)控件的類對(duì)象指針是通過CWnd類的成員函數(shù)GetDlgItem來實(shí)現(xiàn)的,它具有下列原型:CWnd*GetDlgItem(intnID)const;voidGetDlgItem(intnID,HWND*phWnd)const;5.1.3控件類和控件對(duì)象【例Ex_Member】使用控件變量(1)創(chuàng)建一個(gè)默認(rèn)的對(duì)話框應(yīng)用程序Ex_Member。(2)在打開的對(duì)話框資源模板中,刪除“TODO:在這里設(shè)置對(duì)話控制?!膘o態(tài)文本控件,將“確定”和“取消”按鈕向?qū)υ捒蜃筮呉苿?dòng)一段位置,然后將鼠標(biāo)移至對(duì)話框資源模板右下角的實(shí)心藍(lán)色方塊處,拖動(dòng)鼠標(biāo),將對(duì)話框資源模板的大小縮小一些。(3)在對(duì)話框資源模板的左邊添加一個(gè)編輯框控件和一個(gè)按鈕控件,保留其默認(rèn)屬性,并將其布局得整齊一些,如圖5.7所示。5.1.3控件類和控件對(duì)象(4)按快捷鍵【Ctrl+W】,打開MFCClassWizard對(duì)話框,并切換到MemberVariables頁面,查看“Classname”列表中是否選擇了CEx_MemberDlg,此時(shí)可以在ControlIDs列表中看到剛才添加的控件和編輯框的標(biāo)識(shí)符IDC_BUTTON1和IDC_EDIT1。(5)在ControlIDs列表中,選定按鈕控件標(biāo)識(shí)符IDC_BUTTON1,雙擊鼠標(biāo)左鍵或單擊 按鈕,彈出AddMemberVariable對(duì)話框,如圖5.8所示。5.1.3控件類和控件對(duì)象(6)在Membervariablename框中填好與控件相關(guān)聯(lián)的成員變量m_btnWnd,且使Category(類別)項(xiàng)為“Control”,單擊

“OK”按鈕,又回到MFCClassWizard對(duì)話框的MemberVariables頁面中,在ControlIDs列表中出現(xiàn)剛才添加的CButton控件對(duì)象m_btnWnd。(7)將MFCClassWizard對(duì)話框切換到MessageMaps頁面,為CEx_MemberDlg添加IDC_BUTTON1的BN_CLICKED消息映射函數(shù)OnButton1,并添加下列代碼:voidCEx_MemberDlg::OnButton1(){

CStringstrEdit; //定義一個(gè)字符串 CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1); pEdit->GetWindowText(strEdit); //獲取編輯框中的內(nèi)容 strEdit.TrimLeft(); strEdit.TrimRight(); if(strEdit.IsEmpty()) m_btnWnd.SetWindowText(_T("Button1")); else m_btnWnd.SetWindowText(strEdit);}(8)編譯并運(yùn)行。5.1.4DDX和DDV下面來看一個(gè)示例,它是在Ex_Member項(xiàng)目基礎(chǔ)上進(jìn)行的。(1)按快捷鍵【Ctrl+W】,打開MFCClassWizard對(duì)話框,并切換到MemberVariables頁面,查看“Classname”列表中是否選擇了CEx_MemberDlg。(2)在ControlIDs列表中,選定按鈕控件標(biāo)識(shí)符IDC_EDIT1,雙擊鼠標(biāo)左鍵或單擊 按鈕,彈出AddMemberVariable對(duì)話框,將Category(類別)選為默認(rèn)的Value(值),將Variabletype選為默認(rèn)的CString,在Membervariablename框中填好與控件相關(guān)聯(lián)的成員變量m_strEdit,如圖5.9所示。5.1.4DDX和DDV(3)單擊“OK”按鈕,又回到MFCClassWizard對(duì)話框的MemberVariables頁面中,在ControlIDs列表中出現(xiàn)剛才添加的編輯框控件變量m_strEdit。選擇后,將在MFCClassWizard對(duì)話框下方出現(xiàn)MaximumCharacters編輯框,從中可設(shè)定該變量允許的最大字符個(gè)數(shù),這就是控件變量的DDV設(shè)置。填入10,如圖5.10所示,然后單擊“確定”按鈕,退出MFCClassWizard對(duì)話框。5.1.4DDX和DDV(4)將項(xiàng)目工作區(qū)切換到ClassView頁面,展開CEx_MemberDlg類節(jié)點(diǎn),雙擊OnButton1成員函數(shù)節(jié)點(diǎn),定位到CEx_MemberDlg::OnButton1函數(shù)實(shí)現(xiàn)代碼處,將代碼修改如下:voidCEx_MemberDlg::OnButton1(){

UpdateData(); //將控件的內(nèi)容存放到變量中 //沒有參數(shù),表示使用的是默認(rèn)參數(shù)值TRUE m_strEdit.TrimLeft(); m_strEdit.TrimRight(); if(m_strEdit.IsEmpty()) m_btnWnd.SetWindowText(_T("Button1")); else m_btnWnd.SetWindowText(m_strEdit);

}(5)編譯并運(yùn)行。5.2靜態(tài)控件和按鈕5.2.1靜態(tài)控件5.2.1靜態(tài)控件【例Ex_Etched】制作水平蝕刻線(1)創(chuàng)建一個(gè)默認(rèn)的對(duì)話框應(yīng)用程序Ex_Etched。(2)在打開的對(duì)話框資源模板中,刪除“TODO:在這里設(shè)置對(duì)話控制”。靜態(tài)文本控件,將

“確定”和“取消”

按鈕向?qū)υ捒蜃筮呉苿?dòng)一段位置,然后將鼠標(biāo)移至對(duì)話框資源模板右下角的實(shí)心藍(lán)色方塊處,拖動(dòng)鼠標(biāo),將對(duì)話框資源模板的大小縮小一些。(3)在對(duì)話框資源模板中的靠左中間位置添加一個(gè)靜態(tài)圖片控件,右擊該控件,從彈出的快捷菜單中選擇“屬性”,彈出其屬性對(duì)話框。(4)將“類型”選擇為默認(rèn)的“框架(Frame)”類型,將“顏色”類型選為“蝕刻(Etched)”,然后關(guān)閉屬性對(duì)話框。此時(shí),靜態(tài)圖片控件變成一個(gè)蝕刻的矩形框。5.2.1靜態(tài)控件(5)將鼠標(biāo)移動(dòng)到添加的靜態(tài)圖片控件的右下角位置,使鼠標(biāo)指針變成,拖動(dòng)鼠標(biāo)使控件的大小變成一條水平線,單擊對(duì)話框測(cè)試按鈕,結(jié)果如圖5.12所示。水平蝕刻線5.2.2按鈕在Windows中所用的按鈕是用來實(shí)現(xiàn)一種開與關(guān)的輸入,常見的按鈕有三種類型:按鍵按鈕、單選按鈕和復(fù)選框按鈕,如圖5.13所示。5.2.2按鈕1.不同按鈕的作用“按鍵按鈕”通??梢粤⒓串a(chǎn)生某個(gè)動(dòng)作,執(zhí)行某個(gè)命令,因此也常稱為命令按鈕。按鍵按鈕有兩種樣式:標(biāo)準(zhǔn)按鍵按鈕和默認(rèn)按鍵按鈕(或稱缺省按鈕)。2.按鈕的消息按鈕消息常見的只有兩個(gè):BN_CLICKED(單擊按鈕)和BN_DOUBLE_CLICKED(雙擊按鈕)。3.按鈕操作最常用的按鈕操作是設(shè)置或獲取一個(gè)或多個(gè)按鈕的選中狀態(tài)。封裝按鈕的CButton類中的成員函數(shù)SetCheck和GetCheck就是分別用來設(shè)置或獲取指定按鈕的選中狀態(tài),其原型如下:voidSetCheck(int

nCheck);int

GetCheck()const;5.2.3示例:制作問卷調(diào)查【例Ex_Research】

制作問卷調(diào)查1.創(chuàng)建并設(shè)計(jì)對(duì)話框(1)創(chuàng)建一個(gè)默認(rèn)的基于對(duì)話框的應(yīng)用Ex_Research。系統(tǒng)會(huì)自動(dòng)打開對(duì)話框編輯器并顯示對(duì)話框資源模板。單擊對(duì)話框編輯器工具欄上的切換網(wǎng)格按鈕

,顯示對(duì)話框網(wǎng)格。(2)調(diào)整對(duì)話框的大小,刪除對(duì)話框中間的“TODO:在這里設(shè)置對(duì)話控制。”靜態(tài)文本控件,將“確定”和“取消”按鈕移至對(duì)話框的下方,并向?qū)υ捒蛑刑砑咏M框(Group)控件,然后調(diào)整其大小和位置。(3)右擊添加的組框控件,從彈出的快捷菜單中選擇“屬性”菜單,出現(xiàn)該控件的屬性對(duì)話框,在“常規(guī)”頁面中可以看到它的ID為默認(rèn)的IDC_STATIC。將其“標(biāo)題”(Caption)屬性內(nèi)容由“Static”改成“你的年齡”。在組框控件的“樣式(Styles)”屬性中,“水平排列”屬性用來指定文本在頂部的左邊(Left)、居中(Center)還是右邊(Right)。5.2.3示例:制作問卷調(diào)查(4)在組框內(nèi)添加4個(gè)單選按鈕,默認(rèn)的ID依次為IDC_RADIO1、IDC_RADIO2、IDC_RADIO3和IDC_RADIO4。在其屬性對(duì)話框中將ID屬性內(nèi)容分別改成IDC_AGE_L18、IDC_AGE_18T27、IDC_AGE_28T38和IDC_AGE_M38,然后將其“標(biāo)題”(Caption)屬性內(nèi)容分別改成“<18”、“18-27”、“28-38”和“>38”,最后調(diào)整位置,結(jié)果如圖5.15所示。

5.2.3示例:制作問卷調(diào)查(5)接下來添加一個(gè)靜態(tài)文本,標(biāo)題設(shè)為“你使用的接入方式:”,然后在其下再添加4個(gè)單選按鈕,標(biāo)題分別是“FTTL或ADSL”、“單位LAN”、“撥號(hào)56K”和“其他”,并將相應(yīng)的ID屬性依次改成:IDC_CM_FTTL、IDC_CM_LAN、IDC_CM_56K和IDC_CM_OTHER。用對(duì)話框編輯器工具欄的按鈕命令調(diào)整控件左右之間的間距,結(jié)果如圖5.16所示。5.2.3示例:制作問卷調(diào)查(6)在對(duì)話框的下方,再添加一個(gè)組框控件,其標(biāo)題為“你上網(wǎng)主要是”。然后添加4個(gè)復(fù)選框,其標(biāo)題分別為“收發(fā)郵件”、“瀏覽資料”、“聊天游戲”和“其他”,ID分別為IDC_DO_POP、IDC_DO_READ、IDC_DO_GAME和IDC_DO_OTHER,結(jié)果如圖5.17所示。5.2.3示例:制作問卷調(diào)查(7)單擊工具欄上的測(cè)試對(duì)話框按鈕。對(duì)話框測(cè)試后可以發(fā)現(xiàn),順序添加的這8個(gè)單選按鈕全部變成一組,解決這個(gè)問題的最好辦法是將每一組中的第1個(gè)單選按鈕的“組”(Group)屬性選中。因此,分別將以上兩個(gè)問題中的第1個(gè)單選按鈕的“組”(Group)屬性選中,如圖5.18所示。5.2.3示例:制作問卷調(diào)查2.完善代碼(1)將項(xiàng)目工作區(qū)切換到ClassView頁面,展開CEx_ResearchDlg類的所有成員,雙擊OnInitDialog函數(shù)節(jié)點(diǎn),將會(huì)在文檔窗口中自動(dòng)定位到該函數(shù)的實(shí)現(xiàn)代碼處,為此函數(shù)添加下列初始化代碼:BOOLCEx_ResearchDlg::OnInitDialog(){

CDialog::OnInitDialog(); //…

CheckRadioButton(IDC_AGE_L18,IDC_AGE_M38,IDC_AGE_18T27);

CheckRadioButton(IDC_CM_FTTL,IDC_CM_OTHER,IDC_CM_FTTL);

CButton*pBtn=(CButton*)GetDlgItem(IDC_DO_POP);

pBtn->SetCheck(1); //使“收發(fā)郵件”復(fù)選框被選中 returnTRUE; //returnTRUEunlessyousetthefocustoacontrol}5.2.3示例:制作問卷調(diào)查(2)打開MFCClassWizard對(duì)話框,在CEx_ResearchDlg類中添加IDOK按鈕的BN_CLICKED消息映射,并添加下列代碼。(3)編譯并運(yùn)行,出現(xiàn)“上網(wǎng)問卷調(diào)查”對(duì)話框,當(dāng)回答問題后,按“確定”按鈕,出現(xiàn)如圖5.19所示的消息對(duì)話框,顯示選擇的內(nèi)容。5.3編輯框和旋轉(zhuǎn)按鈕控件5.3.1編輯框的屬性和通知消息用對(duì)話框編輯器可以方便地設(shè)置編輯框的屬性和樣式,如圖5.20所示。5.3.1編輯框的屬性和通知消息表5.2列出了其中各項(xiàng)的含義。項(xiàng)

目說

明排列文本(Aligntext)各行文本對(duì)齊方式:Left、Center、Right,默認(rèn)時(shí)為L(zhǎng)eft多行(Multiline)選中時(shí)為多行編輯框,否則為單行編輯框數(shù)字(Number)選中時(shí)控件只能輸入數(shù)字水平滾動(dòng)(Horizontalscroll)水平滾動(dòng),僅對(duì)多行編輯框有效自動(dòng)水平滾動(dòng)(AutoHScroll)當(dāng)用戶在行尾輸入一個(gè)字符時(shí),文本自動(dòng)向右滾動(dòng)垂直滾動(dòng)(Verticalscroll)垂直滾動(dòng),僅對(duì)多行編輯框有效自動(dòng)垂直滾動(dòng)(AutoVScroll)當(dāng)用戶在最后一行按【Enter】鍵時(shí),文本自動(dòng)向上滾動(dòng)一頁,僅對(duì)多行編輯框有效密碼(Password)選中時(shí),輸入編輯框的字符都將顯示為“*”,僅對(duì)單行編輯框有效沒有隱藏選擇(Nohideselection)通常情況下,當(dāng)編輯框失去鍵盤焦點(diǎn)時(shí),被選擇的文本仍然反色顯示。選中時(shí),則不具備此功能OEM轉(zhuǎn)換(OEMconvert)選中時(shí),實(shí)現(xiàn)對(duì)特定字符集的字符轉(zhuǎn)換需要返回(Wantreturn)選中時(shí),用戶按下【Enter】鍵,編輯框中就會(huì)插入一個(gè)回車符邊框(Border)選中時(shí),控件的周圍存在邊框大寫(Uppercase)選中時(shí),輸入在編輯框的字符全部轉(zhuǎn)換成大寫形式小寫(Lowercase)選中時(shí),輸入在編輯框的字符全部轉(zhuǎn)換成小寫形式只讀(Read-Only)選中時(shí),防止用戶輸入或編輯文本5.3.1編輯框的屬性和通知消息當(dāng)編輯框的文本被修改或者滾動(dòng)時(shí),會(huì)向其父窗口發(fā)送一些消息,如表5.3所示。通知消息說

明EN_CHANGE若編輯框中的文本已被修改,在新的文本顯示之后發(fā)送此消息EN_HSCROLL若編輯框的水平滾動(dòng)條被使用,在更新顯示之前發(fā)送此消息EN_KILLFOCUS編輯框失去鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息EN_MAXTEXT文本數(shù)目達(dá)到了限定值時(shí)發(fā)送此消息EN_SETFOCUS編輯框得到鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息EN_UPDATE編輯框中的文本已被修改,新的文本顯示之前發(fā)送此消息EN_VSCROLL若編輯框的垂直滾動(dòng)條被使用,在更新顯示之前發(fā)送此消息5.3.2編輯框的基本操作1.口令設(shè)置口令設(shè)置在編輯框中不同于一般的文本編輯框,用戶輸入的每個(gè)字符都被一個(gè)特殊的字符代替顯示,這個(gè)特殊的字符稱為口令字符。默認(rèn)的口令字符是“*”,應(yīng)用程序可以用成員函數(shù)CEdit::SetPasswordChar

來定義自己的口令字符,其函數(shù)原型如下:voidSetPasswordChar(TCHARch);2.選擇文本在編輯框中編輯文本時(shí),往往需要選定文本作為整體進(jìn)行各種編輯操作。用戶可以用鼠標(biāo)或鍵盤來選擇文本。用鼠標(biāo)來選擇文本的操作方法是:在要選擇的文本的一端按下鼠標(biāo)左鍵并拖動(dòng)鼠標(biāo),到另一端釋放鼠標(biāo)左鍵。用鍵盤來選擇文本的方法是:在按光標(biāo)方向移動(dòng)鍵的同時(shí),按住【Shift】鍵。5.3.2編輯框的基本操作3.設(shè)置編輯框的頁面邊距設(shè)置編輯框的頁面邊距可以使文本在編輯框中的顯示更具滿意效果,這在多行編輯框中尤為重要,應(yīng)用程序可通過調(diào)用成員函數(shù)CEdit::SetMargins來實(shí)現(xiàn),這個(gè)函數(shù)的原型如下:voidSetMargins(UINTnLeft,UINTnRight);4.剪貼板操作編輯框通過CEdit類的Copy、Paste和Cut成員函數(shù)來實(shí)現(xiàn)文本的復(fù)制、粘貼、剪切操作,并自動(dòng)支持鍵盤快捷操作,其對(duì)應(yīng)的快捷鍵分別為【Ctrl+C】、【Ctrl+V】和【Ctrl+X】。若應(yīng)用程序調(diào)用CEdit::Undo函數(shù),則還可撤銷當(dāng)前的操作,再調(diào)用一次該函數(shù),即可恢復(fù)剛才的操作。例如下面的代碼:if(m_Edit.CanUndo()) m_Edit.Undo();5.3.2編輯框的基本操作5.獲取多行編輯框文本一種是使用DDX/DDV,當(dāng)將編輯框控件所關(guān)聯(lián)的變量類型選定為CString后,則不管多行編輯框的文本有多少都可用此變量來保存,從而能簡(jiǎn)單地解決多行文本的讀取。但這種方法不能單獨(dú)獲得多行編輯框中的某一行文本。另一種方法是使用編輯框CEdit類的相關(guān)成員函數(shù)來獲取文本。例如,下面的代碼將顯示編輯框中第二行的文本內(nèi)容:charstr[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.3旋轉(zhuǎn)按鈕控件1.旋轉(zhuǎn)按鈕控件常用的樣式旋轉(zhuǎn)按鈕控件有許多樣式,它們都可以通過旋轉(zhuǎn)按鈕控件屬性對(duì)話框進(jìn)行設(shè)置,如圖5.22所示,其中各項(xiàng)的含義見表5.4。5.3.3旋轉(zhuǎn)按鈕控件項(xiàng)

目說

明方向(Orientation)控件放置方向:垂直(Vertical)、水平(Horizontal)。排列(Alignment)控件在伙伴窗口的位置安排:獨(dú)立(Unattached)、Right(右邊)、Left(左邊)自動(dòng)結(jié)伴(Autobuddy)選中此項(xiàng),自動(dòng)選擇一個(gè)Z-order中的前一個(gè)窗口作為控件的伙伴窗口自動(dòng)結(jié)伴整數(shù)(Setbuddyinteger)選中此項(xiàng),使控件設(shè)置伙伴窗口數(shù)值,這個(gè)值可以是十進(jìn)制或十六進(jìn)制沒有上千(Nothousands)選中此項(xiàng),不在每隔三個(gè)十進(jìn)制數(shù)字的地方加上千分隔符換行(Wrap)選中此項(xiàng),當(dāng)增加或減小的數(shù)值超出范圍,則從最小值或最大值開始回繞箭頭鍵(Arrowkeys)選中此項(xiàng),當(dāng)按下向上和向下方向鍵時(shí),也能增加或減小熱軌跡(Hottrack)選中此項(xiàng),當(dāng)光標(biāo)移過控件時(shí),突出顯示控件的上下按鈕表5.4旋轉(zhuǎn)按鈕控件的樣式屬性選擇“布局”→“Tab次序”菜單命令,或按快捷鍵【Ctrl+D】,此時(shí)每個(gè)控件的左上方都有一個(gè)數(shù)字,表明了當(dāng)前【Tab】鍵次序,這個(gè)次序就是在對(duì)話框顯示時(shí)按【Tab】鍵所選擇控件的次序。5.3.3旋轉(zhuǎn)按鈕控件2.旋轉(zhuǎn)按鈕控件的基本操作成員函數(shù)SetBase是用來設(shè)置其基數(shù)的,這個(gè)基數(shù)值決定了伙伴窗口顯示的數(shù)字是十進(jìn)制還是十六進(jìn)制。如果成功則返回先前的基數(shù)值,如果給出的是一個(gè)無效的基數(shù)則返回一個(gè)非零值。函數(shù)的原型如下:int

SetBase(int

nBase);成員函數(shù)SetPos和SetRange分別用來設(shè)置旋轉(zhuǎn)按鈕控件的當(dāng)前位置和范圍,它們的函數(shù)原型如下:int

SetPos(int

nPos);voidSetRange(int

nLower,int

nUpper);如:m_SpinNumber.SetRange(0,100);3.旋轉(zhuǎn)按鈕控件的通知消息旋轉(zhuǎn)按鈕控件的通知消息只有一個(gè):UDN_DELTAPOS,它是在當(dāng)控件的當(dāng)前數(shù)值將要改變時(shí)向其父窗口發(fā)送的。5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)【例Ex_Ctrl1SDI】

用對(duì)話框輸入學(xué)生成績(jī)1.添加并設(shè)計(jì)對(duì)話框(1)用MFCAppWizard(exe)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Ctrl1SDI。(2)添加一個(gè)新的對(duì)話框資源,將ID改為IDD_INPUT,標(biāo)題為“學(xué)生成績(jī)輸入”,將對(duì)話框字體改為“宋體,9號(hào)”。將“OK”和“Cancel”按鈕標(biāo)題改為“確定”和“取消”。(3)調(diào)整對(duì)話框的大小,將“確定”和“取消”按鈕移至對(duì)話框的下方,然后顯示對(duì)話框網(wǎng)格。向?qū)υ捒蛱砑尤绫?.5所示的控件,調(diào)整控件的位置,結(jié)果如圖5.24所示。

5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)添加的控件ID標(biāo)

題其

性編輯框IDC_EDIT_NAME—默認(rèn)編輯框IDC_EDIT_NO—默認(rèn)編輯框IDC_EDIT_S1—默認(rèn)旋轉(zhuǎn)按鈕控件IDC_SPIN_S1—自動(dòng)結(jié)伴,靠右排列編輯框IDC_EDIT_S2—默認(rèn)旋轉(zhuǎn)按鈕控件IDC_SPIN_S2—自動(dòng)結(jié)伴,設(shè)置結(jié)伴整數(shù),靠右排列編輯框IDC_EDIT_S3—默認(rèn)旋轉(zhuǎn)按鈕控件IDC_SPIN_S3—自動(dòng)結(jié)伴,設(shè)置結(jié)伴整數(shù),靠右排列表5.5學(xué)生成績(jī)輸入對(duì)話框添加的控件5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)(4)選擇“布局”→“Tab次序”菜單命令,或按快捷鍵【Ctrl+D】,此時(shí)每個(gè)控件的左上方都有一個(gè)數(shù)字,表明了當(dāng)前【Tab】鍵次序,這個(gè)次序就是在對(duì)話框顯示時(shí)按【Tab】鍵所選擇控件的次序。(5)單擊對(duì)話框中的控件,重新設(shè)置控件的【Tab】鍵次序,以保證旋轉(zhuǎn)按鈕控件的【Tab】鍵次序在相對(duì)應(yīng)的編輯框(伙伴窗口)之后,結(jié)果如圖5.25所示,單擊對(duì)話框或按【Enter】鍵結(jié)束TabOrder方式。(6)雙擊對(duì)話框模板空白處,為該對(duì)話框模板創(chuàng)建一個(gè)對(duì)話框類CInputDlg。5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)2.完善CInputDlg類代碼(1)在MFCClassWizard的MemberVariables頁面中,確定Classname中是否已選擇了CInputDlg,選中所需的控件ID,雙擊鼠標(biāo)或單擊AddVariables按鈕。依次為表5.6中的控件增加成員變量。控件ID變

別變

型變

名范圍和大小IDC_EDIT_NAMEValueCStringm_strName-20IDC_EDIT_NOValueCStringm_strNO20IDC_EDIT_S1Valuefloatm_fScore10.0~100.0IDC_SPIN_S1ControlCSpinButtonCtrlm_spinScore1—IDC_EDIT_S2Valuefloatm_fScore20.0~100.0IDC_SPIN_S2ControlCSpinButtonCtrlm_spinScore2—IDC_EDIT_S3Valuefloatm_fScore30.0~100.0IDC_SPIN_S3ControlCSpinButtonCtrlm_spinScore3—5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)(2)在MFCClassWizard的MesssageMaps頁面中,為CInputDlg添加WM_INITDIALOG消息映射,并添加下列代碼:BOOLCInputDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_spinScore1.SetRange(0,100); //設(shè)置旋轉(zhuǎn)按鈕控件范圍 m_spinScore2.SetRange(0,100); m_spinScore5.SetRange(0,100); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol}5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)(3)用MFCClassWizard為CInputDlg增加IDC_SPIN_S1控件的UDN_DELTAPOS消息映射,并添加下列代碼:voidCInputDlg::OnDeltaposSpinS1(NMHDR*pNMHDR,LRESULT*pResult){ NM_UPDOWN*pNMUpDown=(NM_UPDOWN*)pNMHDR; UpdateData(TRUE); //將控件的內(nèi)容保存到變量中 m_fScore1+=(float)pNMUpDown->iDelta*0.5f; if(m_fScore1<0.0) m_fScore1=0.0f; if(m_fScore1>100.0) m_fScore1=100.0f; UpdateData(FALSE); //將變量的內(nèi)容顯示在控件中 *pResult=0;}5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)3.調(diào)用對(duì)話框(1)打開Ex_Ctrl1SDI單文檔應(yīng)用程序的菜單資源,添加頂層菜單項(xiàng)“測(cè)試(&T)”,在其下添加一個(gè)菜單項(xiàng)“學(xué)生成績(jī)輸入(&I)”,ID為ID_TEST_INPUT。(2)用MFCClassWizard為CMainFrame類添加菜單項(xiàng)ID_TEST_INPUT的COMMAND消息映射,取默認(rèn)的映射函數(shù)名,并添加下列代碼:voidCMainFrame::OnTestInput(){

CInputDlg

dlg; if(IDOK==dlg.DoModal()) //獲取對(duì)話框數(shù)據(jù) {

CString

str;

str.Format("%s,%s,%4.1f,%4.1f,%4.1f",

dlg.m_strName, dlg.m_strNO, dlg.m_fScore1, dlg.m_fScore2, dlg.m_fScore3);

AfxMessageBox(str); }}5.3.4示例:用對(duì)話框輸入學(xué)生成績(jī)(3)在文件MainFrm.cpp的前面添加CInputDlg類的頭文件包含:#include"Ex_Ctrl1SDI.h"#include"MainFrm.h"#include"InputDlg.h"(4)編譯并運(yùn)行,在應(yīng)用程序的菜單上,選擇“測(cè)試”→“學(xué)生成績(jī)輸入”菜單項(xiàng),將彈出如圖5.23所示的對(duì)話框。單擊成績(jī)1的旋轉(zhuǎn)按鈕控件將以0.5的增量來改變它的伙伴窗口的數(shù)值。5.4列表框5.4.1列表框的樣式和消息列表框還有一系列其他樣式,用來定義列表框的外觀及操作方式,這些樣式可在如

圖5.27所示的列表框?qū)傩詫?duì)話框中設(shè)置。

5.4.1列表框的樣式和消息表5.7列出了各樣式(Style)的含義。項(xiàng)

目說

明選擇(Selection)指定列表框的類型:?jiǎn)蝹€(gè)(Single)、多選(Multiple)、擴(kuò)展多選(Extended)、不選(None)所有者繪制(Ownerdraw)自畫列表框,默認(rèn)為No有字符串(Hasstrings)選中時(shí),在自畫列表框中的項(xiàng)目中含有字符串文本邊框(Border)選中時(shí),使列表框含有邊框分類(Sort)選中時(shí),列表框的項(xiàng)目按字母順序排列通知(Notify)選中時(shí),當(dāng)用戶對(duì)列表框操作,就會(huì)向父窗口發(fā)送通知消息多列(Multi-column)選中時(shí),指定一個(gè)可水平滾動(dòng)的多列列表框水平滾動(dòng)(Horizontalscroll)選中時(shí),在列表框中創(chuàng)建一個(gè)水平滾動(dòng)條垂直滾動(dòng)(Verticalscroll)選中時(shí),在列表框中創(chuàng)建一個(gè)垂直滾動(dòng)條不刷新屏幕(Noredraw)選中時(shí),列表框發(fā)生變化后不會(huì)自動(dòng)重畫使用制表站(位)(Usetabstops)選中時(shí),允許使用停止位來調(diào)整列表項(xiàng)的水平位置需要鍵輸入(Wantkeyinput)選中此項(xiàng),當(dāng)用戶按鍵且列表框有輸入焦點(diǎn)時(shí),就會(huì)向列表框的父窗口發(fā)送相應(yīng)消息禁止不滾動(dòng)(Disablenoscroll)選中時(shí),即使列表框的列表項(xiàng)能全部顯示,垂直滾動(dòng)條也會(huì)顯示,但此時(shí)是禁用的(灰顯)沒有完整高度(Nointegralheight)選中時(shí),在創(chuàng)建列表框的過程中,系統(tǒng)會(huì)把用戶指定的尺寸完全作為列表框的尺寸,而不管是否會(huì)有項(xiàng)目在列表框中不能完全顯示出來5.4.1列表框的樣式和消息當(dāng)列表框中發(fā)生了某個(gè)動(dòng)作,如雙擊選擇了列表框中某一項(xiàng)時(shí),列表框就會(huì)向其父窗口發(fā)送一條通知消息。常用的通知消息如表5.8所示。通知消息說

明LBN_DBLCLK用戶雙擊列表框的某項(xiàng)字符串時(shí)發(fā)送此消息LBN_KILLFOCUS列表框失去鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息LBN_SELCANCEL當(dāng)前選擇項(xiàng)被取消時(shí)發(fā)送此消息LBN_SELCHANGE列表框中的當(dāng)前選擇項(xiàng)將要改變時(shí)發(fā)送此消息LBN_SETFOCUS列表框獲得鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息5.4.2列表框的基本操作1.添加列表項(xiàng)列表框創(chuàng)建時(shí)是一個(gè)空的列表,需要用戶添加或插入一些列表項(xiàng)。CListBox類成員函數(shù)AddString

和InsertString

分別用來向列表框增加列表項(xiàng),其函數(shù)原型如下:int

AddString(LPCTSTRlpszItem);int

InsertString(int

nIndex,LPCTSTRlpszItem);上述兩個(gè)函數(shù)只能將字符串增加到列表框中,但有時(shí)用戶還會(huì)需要根據(jù)列表項(xiàng)使用其他數(shù)據(jù)。這時(shí),就需要調(diào)用CListBox的SetItemData和SetItemDataPtr,它們能使用戶數(shù)據(jù)和某個(gè)列表項(xiàng)關(guān)聯(lián)起來。int

SetItemData(int

nIndex,DWORDdwItemData);int

SetItemDataPtr(int

nIndex,void*pData);5.4.2列表框的基本操作2.刪除列表項(xiàng)CListBox類成員函數(shù)DeleteString和ResetContent分別用來刪除指定的列表項(xiàng)和清除列表框所有項(xiàng)目。它們的函數(shù)原型如下:int

DeleteString(UINTnIndex); //nIndex指定要?jiǎng)h除的列表項(xiàng)的索引voidResetContent();3.查找列表項(xiàng)為了保證列表項(xiàng)不會(huì)重復(fù)地添加在列表框中,有時(shí)還需要對(duì)列表項(xiàng)進(jìn)行查找。CListBox類成員函數(shù)FindString

和FindStringExact分別用來在列表框中查找所匹配的列表項(xiàng)。其中,F(xiàn)indStringExact的查找精度最高。int

FindString(int

nStartAfter,LPCTSTRlpszItem)const;int

FindStringExact(int

nIndexStart,LPCTSTRlpszFind)const;5.4.2列表框的基本操作4.列表框的單項(xiàng)選擇當(dāng)選中列表框中某個(gè)列表項(xiàng)后,用戶可以使用CListBox::GetCurSel來獲取這個(gè)結(jié)果,與該函數(shù)相對(duì)應(yīng)的CListBox::SetCurSel

函數(shù)用來設(shè)定某個(gè)列表項(xiàng)呈選中狀態(tài)(高亮顯示)。int

GetCurSel()const; //返回當(dāng)前選擇項(xiàng)的索引int

SetCurSel(int

nSelect);若要獲取某個(gè)列表項(xiàng)的字符串,可使用下列函數(shù):int

GetText(int

nIndex,LPTSTRlpszBuffer)const;voidGetText(int

nIndex,CString&rString)const;5.4.2列表框的基本操作5.列表框的多項(xiàng)選擇當(dāng)在列表框的Style屬性對(duì)話框中選中多選(Multiple)或擴(kuò)展多選(Extended)類型后,就可以在列表框中進(jìn)行多項(xiàng)選擇。要想獲得選中的多個(gè)選項(xiàng),需要用MFCClassWizard映射列表框控件的LBN_SELCHANGE消息,并添加類似下面的一些代碼:voidCListBoxDlg::OnSelchangeList1(){

int

nCount=m_list.GetSelCount(); //獲取用戶選中的項(xiàng)數(shù) if(nCount==LB_ERR)return;

int*buffer=newint[nCount]; //開辟緩沖區(qū)

m_list.GetSelItems(nCount,buffer);//將各個(gè)選項(xiàng)的索引號(hào)內(nèi)容存放在緩沖區(qū)中

CString

allStr=NULL,str; for(inti=0;i<nCount;i++) {

m_list.GetText(buffer[i],str); //獲得各個(gè)索引的項(xiàng)目文本

allStr=allStr+"["+str+"]"; //處理項(xiàng)目文本 } delete[]buffer; //釋放內(nèi)存 //MessageBox(allStr); //處理獲得的文本}5.4.3示例:城市郵政編碼在一組城市郵政編碼中,城市名和郵政編碼是一一對(duì)應(yīng)的。為了能添加和刪除城市郵政編碼列表項(xiàng),需要設(shè)計(jì)一個(gè)這樣的對(duì)話框,如圖5.28所示。5.4.3示例:城市郵政編碼【例Ex_Ctrl2SDI】創(chuàng)建并使用城市郵政編碼對(duì)話框1.添加并設(shè)計(jì)對(duì)話框(1)用MFCAppWizard(exe)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Ctrl2SDI。(2)向應(yīng)用程序中添加一個(gè)對(duì)話框資源IDD_CITYZIP,標(biāo)題定為“城市郵政編碼”,字體設(shè)為“宋體,9號(hào)”,創(chuàng)建此對(duì)話框類為CCityDlg。刪除原來的“Cancel”按鈕,將“OK”按鈕的標(biāo)題改為“退出”。(3)打開對(duì)話框網(wǎng)格,參看圖5.28的控件布局,用編輯器為對(duì)話框添加如表5.9所示的一些控件。添加的控件ID標(biāo)

題其

性列表框IDC_LIST1—默認(rèn)編輯框(城市名)IDC_EDIT_CITY—默認(rèn)編輯框(郵政編碼)IDC_EDIT_ZIP—默認(rèn)按鈕(添加)IDC_BUTTON_ADD添加默認(rèn)按鈕(修改)IDC_BUTTON_DEL修改默認(rèn)5.4.3示例:城市郵政編碼2.完善CCityDlg類代碼(1)打開ClassWizard的MemberVariables頁面,看看Classname是否是CCityDlg,然后選中所需的控件ID,雙擊鼠標(biāo)或單擊AddVariables按鈕,依次為下列控件增加成員變量,如表5.10所示。控件ID變

別變

型變

名范圍和大小IDC_LIST1ControlCListBoxm_ListBox-—IDC_EDIT_CITYValueCStringm_strCity40IDC_EDIT_ZIPValueDWORDm_dwZipCode100000~9999995.4.3示例:城市郵政編碼(2)將項(xiàng)目工作區(qū)切換到ClassView頁面,右擊CCityDlg類名,從彈出的快捷菜單中選擇“AddMemberFunction”,彈出“添加成員函數(shù)”對(duì)話框,在“函數(shù)類型”(FunctionType)框中輸入BOOL,在“函數(shù)描述(聲明)”(FunctionDeclaration)框中輸入IsValidate,單擊按鈕。(3)在CCityDlg::IsValidate函數(shù)中輸入下列代碼:BOOLCCityDlg::IsValidate(){ UpdateData(); m_strCity.TrimLeft(); if(m_strCity.IsEmpty()) { MessageBox("城市名輸入無效!"); returnFALSE; } returnTRUE;}5.4.3示例:城市郵政編碼(4)打開MFCClassWizard,切換到MesssageMaps頁面,在此為對(duì)話框添加WM_INITDIALOG消息映射,并增加下列代碼:BOOLCCityDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_dwZipCode=100000; //設(shè)置初始的郵政編碼 UpdateData(FALSE); //將郵政編碼顯示在控件中 GetDlgItem(IDC_BUTTON_DEL)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}5.4.3示例:城市郵政編碼(5)打開MFCClassWizard,切換到MesssageMaps頁面,為按鈕IDC_BUTTON_ADD添加BN_CLICKED的消息映射,并增加下列代碼:voidCCityDlg::OnButtonAdd(){ if(!IsValidate())return; intnIndex=m_ListBox.FindStringExact(-1,m_strCity); if(nIndex!=LB_ERR) { MessageBox("該城市已添加!"); return; } nIndex=m_ListBox.AddString(m_strCity); m_ListBox.SetItemData(nIndex,m_dwZipCode);}5.4.3示例:城市郵政編碼(6)用MFCClassWizard為按鈕IDC_BUTTON_DEL添加BN_CLICKED的消息映射,并增加下列代碼:voidCCityDlg::OnButtonDel(){ intnIndex=m_ListBox.GetCurSel(); if(nIndex!=LB_ERR) {m_ListBox.DeleteString(nIndex); }else GetDlgItem(IDC_BUTTON_DEL)->EnableWindow(FALSE);}5.4.3示例:城市郵政編碼(7)用MFCClassWizard為列表框IDC_LIST1添加LBN_SELCHANGE(當(dāng)前選擇項(xiàng)發(fā)生改變發(fā)生的消息)的消息映射,并增加下列代碼。這樣,當(dāng)單擊列表框的城市名時(shí),將會(huì)在編輯框中顯示出城市名和郵政編碼。voidCCityDlg::OnSelchangeList1(){ intnIndex=m_ListBox.GetCurSel(); if(nIndex!=LB_ERR) { m_ListBox.GetText(nIndex,m_strCity); m_dwZipCode=m_ListBox.GetItemData(nIndex); UpdateData(FALSE);//使用當(dāng)前列表項(xiàng)所關(guān)聯(lián)的內(nèi)容顯示在控件上 GetDlgItem(IDC_BUTTON_DEL)->EnableWindow(TRUE); }}5.4.3示例:城市郵政編碼3.調(diào)用對(duì)話框(1)打開Ex_Ctrl2SDI單文檔應(yīng)用程序的菜單資源,添加頂層菜單項(xiàng)“測(cè)試(&T)”,在其下添加一個(gè)菜單項(xiàng)“城市郵政編碼(&C)”,ID為ID_TEST_CITY。(2)用MFCClassWizard為CMainFrame類添加菜單項(xiàng)ID_TEST_CITY的COMMAND消息映射,取默認(rèn)的映射函數(shù)名,并添加下列代碼:voidCMainFrame::OnTestCity(){

CCityDlg

dlg;

dlg.DoModal();}(3)在文件MainFrm.cpp的前面添加CCityDlg類的頭文件包含:#include"MainFrm.h"#include"CityDlg.h"(4)編譯運(yùn)行后,在應(yīng)用程序的菜單上,選擇“測(cè)試”→“城市郵政編碼”菜單項(xiàng),將彈出如圖5.28所示的對(duì)話框。5.5組合框5.5.1組合框的樣式類型和消息按照組合框的主要樣式特征,可把組合框分為3類:簡(jiǎn)單組合框、下拉式組合框、下拉式列表框,如圖5.29所示。組合框還有其他一些樣式,這些樣式可在如圖5.30所示的組合框的屬性對(duì)話框中設(shè)置。

5.5.1組合框的樣式類型和消息其各項(xiàng)含義見表5.11。項(xiàng)

目說

明類型(Type)設(shè)置組合框的類型:Simple(簡(jiǎn)單)、Dropdown(下拉)、DropList(下拉列表框)所有者繪制(Ownerdraw)自畫組合框,默認(rèn)為No有字符串(Hasstrings)選中時(shí),在自畫組合框中的項(xiàng)目中含有字符串文本分類(Sort)選中時(shí),組合框的項(xiàng)目按字母順序排列垂直滾動(dòng)(Verticalscroll)選中時(shí),在組合框中創(chuàng)建一個(gè)垂直滾動(dòng)條沒有完整高度(Nointegralheight)選中時(shí),在創(chuàng)建組合框的過程中,系統(tǒng)會(huì)把用戶指定的尺寸完全作為組合框的尺寸,而不管是否會(huì)有項(xiàng)目在組合框中的列表中不能完全顯示出來OEM轉(zhuǎn)換(OEMconvert)選中時(shí),實(shí)現(xiàn)對(duì)特定字符集的字符轉(zhuǎn)換自動(dòng)水平滾動(dòng)(AutoHScroll)當(dāng)用戶在行尾輸入一個(gè)字符時(shí),文本自動(dòng)向右滾動(dòng)禁止不滾動(dòng)(Disablenoscroll)選中時(shí),即使組合框的列表項(xiàng)能全部顯示,垂直滾動(dòng)條也會(huì)顯示,但此時(shí)是禁用的(灰顯)大寫字母(Uppercase)選中時(shí),輸入在編輯框的字符全部轉(zhuǎn)換成大寫形式小寫字母(Lowercase)選中時(shí),輸入在編輯框的字符全部轉(zhuǎn)換成小寫形式5.5.1組合框的樣式類型和消息在組合框的通知消息中,有的是列表框發(fā)出的,有的是編輯框發(fā)出的,如表5.12所示。通知消息說

明CBN_CLOSEUP當(dāng)組合框的列表關(guān)閉時(shí)發(fā)送此消息CBN_DBLCLK用戶雙擊組合框的某項(xiàng)字符串時(shí)發(fā)送此消息CBN_DROPDOWN當(dāng)組合框的列表打開時(shí)發(fā)送此消息CBN_EDITCHANGE同編輯框的EN_CHANGE消息CBN_EDITUPDATE同編輯框的EN_UPDATE消息CBN_SELENDCANCEL當(dāng)前選擇項(xiàng)被取消時(shí)發(fā)送此消息CBN_SELENDOK當(dāng)用戶選擇一個(gè)項(xiàng)并按下【Enter】鍵或單擊下拉箭頭

()隱藏列表框時(shí)發(fā)送此消息CBN_KILLFOCUS組合框失去鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息CBN_SELCHANGE組合框中的當(dāng)前選擇項(xiàng)將要改變時(shí)發(fā)送此消息CBN_SETFOCUS組合框獲得鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息5.5.2組合框常見操作組合框的操作大致分為兩類,一類是對(duì)組合框中的列表框進(jìn)行操作,另一類是對(duì)組合框中的編輯框進(jìn)行操作。這些操作都可以通過調(diào)用CComboBox成員函數(shù)來實(shí)現(xiàn),見表5.13。5.5.3示例:城市郵政編碼和區(qū)號(hào)在前面的【例Ex_Ctrl2SDI】示例中,只是簡(jiǎn)單涉及了城市名和郵政編碼的對(duì)應(yīng)關(guān)系。實(shí)際上,城市名還和區(qū)號(hào)一一對(duì)應(yīng),為此本例需要設(shè)計(jì)這樣的對(duì)話框,如圖5.31所示。5.5.3示例:城市郵政編碼和區(qū)號(hào)【例Ex_Ctrl3SDI】創(chuàng)建并使用城市郵政編碼和區(qū)號(hào)對(duì)話框1.添加并設(shè)計(jì)對(duì)話框(1)用MFCAppWizard(exe)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Ctrl3SDI。(2)向應(yīng)用程序中添加一個(gè)對(duì)話框資源IDD_CITYZONE,標(biāo)題定為“城市郵政編碼和區(qū)號(hào)”,字體設(shè)為“宋體,9號(hào)”,創(chuàng)建此對(duì)話框類為CCityZoneDlg。刪除原來的“Cancel”按鈕,將“OK”按鈕標(biāo)題改為“退出”。(3)打開對(duì)話框網(wǎng)格,參看圖5.31的控件布局,為對(duì)話框添加如表5.14所示的一些控件。添加的控件ID標(biāo)

題其

性組合框IDC_COMBO1—默認(rèn)編輯框(郵政編碼)IDC_EDIT_ZIP—默認(rèn)編輯框(區(qū)號(hào))IDC_EDIT_ZONE—默認(rèn)按鈕(添加)IDC_BUTTON_ADD添加默認(rèn)按鈕(修改)IDC_BUTTON_CHANGE修改默認(rèn)5.5.3示例:城市郵政編碼和區(qū)號(hào)在組合框添加到對(duì)話框模板后,一定要單擊組合框的下拉按鈕(),然后調(diào)整出現(xiàn)的下拉框大小,如圖5.32所示,否則組合框可能因?yàn)橄吕蛱《鵁o法顯示其下拉列表項(xiàng)。下拉框

5.5.3示例:城市郵政編碼和區(qū)號(hào)2.完善CCityZoneDlg類代碼(1)打開MFCClassWizard的MemberVariables頁面,看看Classname是否是CCityZoneDlg,然后選中所需的控件ID,雙擊鼠標(biāo)或單擊AddVariables按鈕。依次為下列控件增加成員變量,如表5.15所示??丶蘒D變

別變

型變

名范圍和大小IDC_COMBO1ControlCComboBoxm_ComboBox-—IDC_COMBO1ValueCstringm_strCity-20IDC_EDIT_ZONEValueCStringm_strZone10IDC_EDIT_ZIPValueCStringm_strZip6(2)將項(xiàng)目工作區(qū)切換到ClassView頁面,右擊CCityZoneDlg類名,從彈出的快捷菜單中選擇“AddMemberFunction”,彈出“添加成員函數(shù)”對(duì)話框,在“函數(shù)類型”框中輸入BOOL,在“函數(shù)聲明”框中輸入IsValidate,單擊“確定”按鈕。5.5.3示例:城市郵政編碼和區(qū)號(hào)(3)在CCityZoneDlg::IsValidate函數(shù)中輸入下列代碼:BOOLCCityZoneDlg::IsValidate(){ UpdateData(); m_strCity.TrimLeft(); if(m_strCity.IsEmpty()) { MessageBox("城市名輸入無效!"); returnFALSE; } m_strZip.TrimLeft(); if(m_strZip.IsEmpty()) { MessageBox("郵政編碼輸入無效!"); returnFALSE; } m_strZone.TrimLeft(); if(m_strZone.IsEmpty()) { MessageBox("區(qū)號(hào)輸入無效!"); returnFALSE; } returnTRUE;}5.5.3示例:城市郵政編碼和區(qū)號(hào)(4)打開MFCClassWizard,切換到MesssageMaps頁面,為按鈕IDC_BUTTON_ADD添加BN_CLICKED的消息映射,并增加下列代碼:voidCCityZoneDlg::OnButtonAdd(){ if(!IsValidate())return; intnIndex=m_ComboBox.FindStringExact(-1,m_strCity); if(nIndex!=CB_ERR) { MessageBox("該城市已添加!"); return; } CStringstrData; strData.Format("%s,%s",m_strZip,m_strZone); //將郵政編碼和區(qū)號(hào)合并為一個(gè)字符串 m_ComboBox.SetItemDataPtr(nIndex,newCString(strData)); }5.5.3示例:城市郵政編碼和區(qū)號(hào)(5)用MFCClassWizard為按鈕IDC_BUTTON_CHANGE添加BN_CLICKED的消息映射,并增加下列代碼:voidCCityZoneDlg::OnButtonChange(){ if(!IsValidate())return; intnIndex=m_ComboBox.FindStringExact(-1,m_strCity); if(nIndex!=CB_ERR) { delete(CString*)m_ComboBox.GetItemDataPtr(nIndex); CStringstrData; strData.Format("%s,%s",m_strZip,m_strZone); m_ComboBox.SetItemDataPtr(nIndex,newCString(strData)); }}5.5.3示例:城市郵政編碼和區(qū)號(hào)(6)用MFCClassWizard為組合框IDC_COMBO1添加CBN_SELCHANGE(當(dāng)前選擇項(xiàng)發(fā)生改變時(shí)發(fā)出的消息)的消息映射,并增加下列代碼:voidCCityZoneDlg::OnSelchangeCombo1(){ intnIndex=m_ComboBox.GetCurSel(); if(nIndex!=CB_ERR) { m_ComboBox.GetLBText(nIndex,m_strCity); CStringstrData; strData=*(CString*)m_ComboBox.GetItemDataPtr(nIndex); //分解字符串 intn=strData.Find(','); m_strZip=strData.Left(n); //前面的n個(gè)字符 m_strZone=strData.Mid(n+1);//從中間第n+1個(gè)字符到末尾的字符串

UpdateData(FALSE); }}5.5.3示例:城市郵政編碼和區(qū)號(hào)(7)用MFCClassWizard為對(duì)話框添加WM_DESTROY的消息映射,并增加下列代碼:voidCCityZoneDlg::OnDestroy() //此消息是當(dāng)對(duì)話框關(guān)閉時(shí)發(fā)送的{ for(intnIndex=m_ComboBox.GetCount()-1;nIndex>=0;nIndex--) { //刪除所有與列表項(xiàng)相關(guān)聯(lián)的CString數(shù)據(jù),并釋放內(nèi)存 delete(CString*)m_ComboBox.GetItemDataPtr(nIndex); } CDialog::OnDestroy();}5.5.3示例:城市郵政編碼和區(qū)號(hào)3.調(diào)用對(duì)話框(1)打開Ex_Ctrl3SDI單文檔應(yīng)用程序的菜單資源,添加頂層菜單項(xiàng)“測(cè)試(&T)”,在其下添加一個(gè)菜單項(xiàng)“城市郵政編碼和區(qū)號(hào)(&Z)”,ID為ID_TEST_CITYZONE。(2)用MFCClassWizard為CMainFrame類添加菜單項(xiàng)ID_TEST_CITYZONE的COMMAND消息映射,取默認(rèn)的映射函數(shù)名,并添加下列代碼:voidCMainFrame::OnTestCityzone(){

CCityZoneDlg

dlg;

dlg.DoModal();}(3)在文件MainFrm.cpp的前面添加CCityZoneDlg類的頭文件包含:#include"MainFrm.h"#include"CityZoneDlg.h"(4)編譯運(yùn)行并測(cè)試。5.6進(jìn)展條、滾動(dòng)條和滑動(dòng)條5.6.1進(jìn)展條進(jìn)展條(進(jìn)程條)是一個(gè)如圖5.33所示的控件。除了能表示一個(gè)過程的進(jìn)展情況外,使用進(jìn)展條還可表明溫度、水平面或類似的測(cè)量值。5.6.1進(jìn)展條1.進(jìn)展條的樣式打開進(jìn)展條的屬性對(duì)話框,如圖5.34所示,可以看到它的樣式屬性并不是很多。5.6.1進(jìn)展條2.進(jìn)展條的基本操作進(jìn)展條的基本操作有設(shè)置其范圍、當(dāng)前位置、增量等。這些操作都是通過CProgressCtrl類的相關(guān)成員函數(shù)來實(shí)現(xiàn)的。int

SetPos(int

nPos);int

GetPos();這兩個(gè)函數(shù)分別用來設(shè)置和獲取進(jìn)展條的當(dāng)前位置。需要說明的是,這個(gè)當(dāng)前位置是指在SetRange中的上限和下限范圍之間的位置。voidSetRange(shortnLower,shortnUpper);voidSetRange32(intnLower,int

nUpper);voidGetRange(int&nLower,int&nUpper);5.6.1進(jìn)展條3.使用進(jìn)展條示例該示例的對(duì)話框中有一個(gè)進(jìn)展條、一個(gè)靜態(tài)文本和三個(gè)按鈕。如圖5.35所示,單擊“繼續(xù)”按鈕,進(jìn)展條向前進(jìn),單擊“后退”按鈕,進(jìn)展條向后退,靜態(tài)文本中還顯示出進(jìn)展條的百分比。5.6.1進(jìn)展條【例Ex_Ctrl4SDI】創(chuàng)建并使用進(jìn)展條對(duì)話框1.添加并設(shè)計(jì)對(duì)話框(1)用MFCAppWizard(exe)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_Ctrl4SDI。(2)向應(yīng)用程序中添加一個(gè)對(duì)話框資源IDD_PROGRESS,標(biāo)題定為“進(jìn)展條對(duì)話框”,字體設(shè)為“宋體,9號(hào)”,創(chuàng)建此對(duì)話框類為CProgressDlg。刪除原來的“Cancel”按鈕,將“OK”按鈕的標(biāo)題改為“退出”。(3)打開對(duì)話框網(wǎng)格,用編輯器為對(duì)話框添加如表5.16所示的一些控件,調(diào)整控件的位置,結(jié)果參見圖5.35。添加的控件ID標(biāo)

題其

性靜態(tài)文本IDC_STATIC_TEXT默認(rèn)對(duì)齊設(shè)為Center,其余默認(rèn)進(jìn)展條IDC_PROGRESS1—默認(rèn)按鈕(后退)IDC_BUTTON_BACK—默認(rèn)按鈕(繼續(xù))IDC_BUTTON_GOON—默認(rèn)5.6.1進(jìn)展條2.完善CProgressDlg類代碼(1)打開ClassWizard的MemberVariables頁面,看看Classname是否是CProgressDlg,選中控件ID(IDC_STATIC_TEXT),雙擊鼠標(biāo)或單擊AddVariables按鈕,為其添加一個(gè)CString類型變量m_strPercent。再為進(jìn)展條IDC_PROGRESS1控件添加一個(gè)CProgressCtrl類變量m_Progress。(2)

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論