版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第5章常用控件5.1創(chuàng)建和使用控件5.2靜態(tài)控件和按鈕5.3編輯框和旋轉(zhuǎn)按鈕控件5.4列表框5.5組合框5.6進展條、滾動條和滑動條5.7日期控件和計時器5.1創(chuàng)建和使用控件5.1.1控件的創(chuàng)建方式5.1.1控件的創(chuàng)建方式(3)將項目工作區(qū)切換到ClassView頁面,展開Ex_Create所有的類節(jié)點,右擊CEx_CreateDlg類名,彈出如圖5.1所示的快捷菜單。5.1.1控件的創(chuàng)建方式從快捷菜單中選擇AddMemberVariable(添加成員變量),出現(xiàn)如圖5.2所示的對話框,在變量類型(VariableType)編輯框中輸入CButton(MFC按鈕類),在變量名稱(VariableName)編輯框中輸入要定義的CButton類對象名m_btnWnd。5.1.1控件的創(chuàng)建方式(4)在項目工作區(qū)窗口的ClassView頁面中,將CEx_CreateDlg節(jié)點展開,雙擊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(); //獲取對話框的字體 m_btnWnd.SetFont(font); //設置控件字體
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}5.1.1控件的創(chuàng)建方式(5)編譯并運行,結(jié)果如圖5.3所示。5.1.2控件的消息及消息映射1.映射控件消息不管是什么控件消息,一般都可以用MFCClassWizard對它們加以映射。例如下面的示例過程:(1)將項目工作區(qū)窗口切換到ResourseView頁面,雙擊Dialog資源下的標識符IDD_EX_CREATE_DIALOG,打開Ex_Create項目的對話框資源模板。(2)選中“TODO:在這里設置對話控制?!笨丶础綝elete】鍵刪除。從控件工具箱中拖放添加一個按鈕控件,如圖5.4所示,保留其默認屬性。5.1.2控件的消息及消息映射(3)按快捷鍵【Ctrl+W】,打開MFCClassWizard對話框,查看“Classname”列表中是否選擇了CEx_CreateDlg,在ObjectIDs列表中選擇IDC_BUTTON1。(4)單擊 按鈕或雙擊BN_CLICKED消息,出現(xiàn)“AddMemberFunction”對話框,在這里可以輸入成員函數(shù)的名稱,系統(tǒng)默認的函數(shù)名為OnButton1,如圖5.5所示。5.1.2控件的消息及消息映射(5)雙擊消息函數(shù)OnButton1或單擊 按鈕,MFCClassWizard對話框退出,并轉(zhuǎn)向文檔窗口,定位到CEx_CreateDlg::OnButton1函數(shù)實現(xiàn)的源代碼處,添加下列代碼:voidCEx_CreateDlg::OnButton1(){ MessageBox(_T("你按下了\"Button1\"按鈕!"));}(6)編譯并運行,當單擊 按鈕時,就會執(zhí)行OnButton1函數(shù),彈出一個消息對話框,顯示“ ”內(nèi)容。5.1.2控件的消息及消息映射2.映射控件通用消息(1)按快捷鍵【Ctrl+W】,打開MFCClassWizard對話框,查看“Classname”列表中是否選擇了CEx_CreateDlg,在ObjectIDs列表中選擇CEx_CreateDlg,在Messages框中找到并雙擊OnCommand,這樣OnCommand消息函數(shù)就添加好了,如圖5.6所示。5.1.2控件的消息及消息映射(2)雙擊消息函數(shù)OnCommand或單擊
按鈕,MFCClassWizard對話框退出,并轉(zhuǎn)向文檔窗口,定位到CEx_CreateDlg::OnCommand函數(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控件類和控件對象表5.1列出了MFC封裝的常用控件類??丶QMFC類功能描述靜態(tài)控件CStatic用來顯示一些幾乎固定不變的文字或圖形按鈕CButton用來產(chǎn)生某些命令或改變某些選項,包括單選按鈕、復選框和組合框編輯框CEdit用于完成文本和數(shù)字的輸入和編輯列表框CListBox顯示一個列表,讓用戶從中選取一個或多個項組合框CComboBox是一個列表框和編輯框組合的控件滾動條CScrollBar通過滾動塊在滾動條上的移動和滾動按鈕來改變某些量進展條CProgressCtrl用來表示一個操作的進度滑動條CSliderCtrl通過滑動塊的移動來改變某些量,并帶有刻度指示旋轉(zhuǎn)按鈕控件CSpinButtonCtrl帶有一對反向箭頭的按鈕,單擊這對按鈕可增大或減小某個值日期時間控件CDateTimeCtrl用于選擇指定的日期和時間圖像列表CImageList一個具有相同大小的圖標或位圖的集合標簽控件CTabCtrl類似于一個筆記本的分隔器或一個文件柜上的標簽,使用它可以將一個窗口或?qū)υ捒虻南嗤瑓^(qū)域定義為多個頁面5.1.3控件類和控件對象在MFC中,獲取一個控件的類對象指針是通過CWnd類的成員函數(shù)GetDlgItem來實現(xiàn)的,它具有下列原型:CWnd*GetDlgItem(intnID)const;voidGetDlgItem(intnID,HWND*phWnd)const;5.1.3控件類和控件對象【例Ex_Member】使用控件變量(1)創(chuàng)建一個默認的對話框應用程序Ex_Member。(2)在打開的對話框資源模板中,刪除“TODO:在這里設置對話控制?!膘o態(tài)文本控件,將“確定”和“取消”按鈕向?qū)υ捒蜃筮呉苿右欢挝恢茫缓髮⑹髽艘浦翆υ捒蛸Y源模板右下角的實心藍色方塊處,拖動鼠標,將對話框資源模板的大小縮小一些。(3)在對話框資源模板的左邊添加一個編輯框控件和一個按鈕控件,保留其默認屬性,并將其布局得整齊一些,如圖5.7所示。5.1.3控件類和控件對象(4)按快捷鍵【Ctrl+W】,打開MFCClassWizard對話框,并切換到MemberVariables頁面,查看“Classname”列表中是否選擇了CEx_MemberDlg,此時可以在ControlIDs列表中看到剛才添加的控件和編輯框的標識符IDC_BUTTON1和IDC_EDIT1。(5)在ControlIDs列表中,選定按鈕控件標識符IDC_BUTTON1,雙擊鼠標左鍵或單擊 按鈕,彈出AddMemberVariable對話框,如圖5.8所示。5.1.3控件類和控件對象(6)在Membervariablename框中填好與控件相關聯(lián)的成員變量m_btnWnd,且使Category(類別)項為“Control”,單擊
“OK”按鈕,又回到MFCClassWizard對話框的MemberVariables頁面中,在ControlIDs列表中出現(xiàn)剛才添加的CButton控件對象m_btnWnd。(7)將MFCClassWizard對話框切換到MessageMaps頁面,為CEx_MemberDlg添加IDC_BUTTON1的BN_CLICKED消息映射函數(shù)OnButton1,并添加下列代碼:voidCEx_MemberDlg::OnButton1(){
CStringstrEdit; //定義一個字符串 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)編譯并運行。5.1.4DDX和DDV下面來看一個示例,它是在Ex_Member項目基礎上進行的。(1)按快捷鍵【Ctrl+W】,打開MFCClassWizard對話框,并切換到MemberVariables頁面,查看“Classname”列表中是否選擇了CEx_MemberDlg。(2)在ControlIDs列表中,選定按鈕控件標識符IDC_EDIT1,雙擊鼠標左鍵或單擊 按鈕,彈出AddMemberVariable對話框,將Category(類別)選為默認的Value(值),將Variabletype選為默認的CString,在Membervariablename框中填好與控件相關聯(lián)的成員變量m_strEdit,如圖5.9所示。5.1.4DDX和DDV(3)單擊“OK”按鈕,又回到MFCClassWizard對話框的MemberVariables頁面中,在ControlIDs列表中出現(xiàn)剛才添加的編輯框控件變量m_strEdit。選擇后,將在MFCClassWizard對話框下方出現(xiàn)MaximumCharacters編輯框,從中可設定該變量允許的最大字符個數(shù),這就是控件變量的DDV設置。填入10,如圖5.10所示,然后單擊“確定”按鈕,退出MFCClassWizard對話框。5.1.4DDX和DDV(4)將項目工作區(qū)切換到ClassView頁面,展開CEx_MemberDlg類節(jié)點,雙擊OnButton1成員函數(shù)節(jié)點,定位到CEx_MemberDlg::OnButton1函數(shù)實現(xiàn)代碼處,將代碼修改如下:voidCEx_MemberDlg::OnButton1(){
UpdateData(); //將控件的內(nèi)容存放到變量中 //沒有參數(shù),表示使用的是默認參數(shù)值TRUE m_strEdit.TrimLeft(); m_strEdit.TrimRight(); if(m_strEdit.IsEmpty()) m_btnWnd.SetWindowText(_T("Button1")); else m_btnWnd.SetWindowText(m_strEdit);
}(5)編譯并運行。5.2靜態(tài)控件和按鈕5.2.1靜態(tài)控件5.2.1靜態(tài)控件【例Ex_Etched】制作水平蝕刻線(1)創(chuàng)建一個默認的對話框應用程序Ex_Etched。(2)在打開的對話框資源模板中,刪除“TODO:在這里設置對話控制”。靜態(tài)文本控件,將
“確定”和“取消”
按鈕向?qū)υ捒蜃筮呉苿右欢挝恢茫缓髮⑹髽艘浦翆υ捒蛸Y源模板右下角的實心藍色方塊處,拖動鼠標,將對話框資源模板的大小縮小一些。(3)在對話框資源模板中的靠左中間位置添加一個靜態(tài)圖片控件,右擊該控件,從彈出的快捷菜單中選擇“屬性”,彈出其屬性對話框。(4)將“類型”選擇為默認的“框架(Frame)”類型,將“顏色”類型選為“蝕刻(Etched)”,然后關閉屬性對話框。此時,靜態(tài)圖片控件變成一個蝕刻的矩形框。5.2.1靜態(tài)控件(5)將鼠標移動到添加的靜態(tài)圖片控件的右下角位置,使鼠標指針變成,拖動鼠標使控件的大小變成一條水平線,單擊對話框測試按鈕,結(jié)果如圖5.12所示。水平蝕刻線5.2.2按鈕在Windows中所用的按鈕是用來實現(xiàn)一種開與關的輸入,常見的按鈕有三種類型:按鍵按鈕、單選按鈕和復選框按鈕,如圖5.13所示。5.2.2按鈕1.不同按鈕的作用“按鍵按鈕”通??梢粤⒓串a(chǎn)生某個動作,執(zhí)行某個命令,因此也常稱為命令按鈕。按鍵按鈕有兩種樣式:標準按鍵按鈕和默認按鍵按鈕(或稱缺省按鈕)。2.按鈕的消息按鈕消息常見的只有兩個:BN_CLICKED(單擊按鈕)和BN_DOUBLE_CLICKED(雙擊按鈕)。3.按鈕操作最常用的按鈕操作是設置或獲取一個或多個按鈕的選中狀態(tài)。封裝按鈕的CButton類中的成員函數(shù)SetCheck和GetCheck就是分別用來設置或獲取指定按鈕的選中狀態(tài),其原型如下:voidSetCheck(int
nCheck);int
GetCheck()const;5.2.3示例:制作問卷調(diào)查【例Ex_Research】
制作問卷調(diào)查1.創(chuàng)建并設計對話框(1)創(chuàng)建一個默認的基于對話框的應用Ex_Research。系統(tǒng)會自動打開對話框編輯器并顯示對話框資源模板。單擊對話框編輯器工具欄上的切換網(wǎng)格按鈕
,顯示對話框網(wǎng)格。(2)調(diào)整對話框的大小,刪除對話框中間的“TODO:在這里設置對話控制。”靜態(tài)文本控件,將“確定”和“取消”按鈕移至對話框的下方,并向?qū)υ捒蛑刑砑咏M框(Group)控件,然后調(diào)整其大小和位置。(3)右擊添加的組框控件,從彈出的快捷菜單中選擇“屬性”菜單,出現(xiàn)該控件的屬性對話框,在“常規(guī)”頁面中可以看到它的ID為默認的IDC_STATIC。將其“標題”(Caption)屬性內(nèi)容由“Static”改成“你的年齡”。在組框控件的“樣式(Styles)”屬性中,“水平排列”屬性用來指定文本在頂部的左邊(Left)、居中(Center)還是右邊(Right)。5.2.3示例:制作問卷調(diào)查(4)在組框內(nèi)添加4個單選按鈕,默認的ID依次為IDC_RADIO1、IDC_RADIO2、IDC_RADIO3和IDC_RADIO4。在其屬性對話框中將ID屬性內(nèi)容分別改成IDC_AGE_L18、IDC_AGE_18T27、IDC_AGE_28T38和IDC_AGE_M38,然后將其“標題”(Caption)屬性內(nèi)容分別改成“<18”、“18-27”、“28-38”和“>38”,最后調(diào)整位置,結(jié)果如圖5.15所示。
5.2.3示例:制作問卷調(diào)查(5)接下來添加一個靜態(tài)文本,標題設為“你使用的接入方式:”,然后在其下再添加4個單選按鈕,標題分別是“FTTL或ADSL”、“單位LAN”、“撥號56K”和“其他”,并將相應的ID屬性依次改成:IDC_CM_FTTL、IDC_CM_LAN、IDC_CM_56K和IDC_CM_OTHER。用對話框編輯器工具欄的按鈕命令調(diào)整控件左右之間的間距,結(jié)果如圖5.16所示。5.2.3示例:制作問卷調(diào)查(6)在對話框的下方,再添加一個組框控件,其標題為“你上網(wǎng)主要是”。然后添加4個復選框,其標題分別為“收發(fā)郵件”、“瀏覽資料”、“聊天游戲”和“其他”,ID分別為IDC_DO_POP、IDC_DO_READ、IDC_DO_GAME和IDC_DO_OTHER,結(jié)果如圖5.17所示。5.2.3示例:制作問卷調(diào)查(7)單擊工具欄上的測試對話框按鈕。對話框測試后可以發(fā)現(xiàn),順序添加的這8個單選按鈕全部變成一組,解決這個問題的最好辦法是將每一組中的第1個單選按鈕的“組”(Group)屬性選中。因此,分別將以上兩個問題中的第1個單選按鈕的“組”(Group)屬性選中,如圖5.18所示。5.2.3示例:制作問卷調(diào)查2.完善代碼(1)將項目工作區(qū)切換到ClassView頁面,展開CEx_ResearchDlg類的所有成員,雙擊OnInitDialog函數(shù)節(jié)點,將會在文檔窗口中自動定位到該函數(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ā)郵件”復選框被選中 returnTRUE; //returnTRUEunlessyousetthefocustoacontrol}5.2.3示例:制作問卷調(diào)查(2)打開MFCClassWizard對話框,在CEx_ResearchDlg類中添加IDOK按鈕的BN_CLICKED消息映射,并添加下列代碼。(3)編譯并運行,出現(xiàn)“上網(wǎng)問卷調(diào)查”對話框,當回答問題后,按“確定”按鈕,出現(xiàn)如圖5.19所示的消息對話框,顯示選擇的內(nèi)容。5.3編輯框和旋轉(zhuǎn)按鈕控件5.3.1編輯框的屬性和通知消息用對話框編輯器可以方便地設置編輯框的屬性和樣式,如圖5.20所示。5.3.1編輯框的屬性和通知消息表5.2列出了其中各項的含義。項
目說
明排列文本(Aligntext)各行文本對齊方式:Left、Center、Right,默認時為Left多行(Multiline)選中時為多行編輯框,否則為單行編輯框數(shù)字(Number)選中時控件只能輸入數(shù)字水平滾動(Horizontalscroll)水平滾動,僅對多行編輯框有效自動水平滾動(AutoHScroll)當用戶在行尾輸入一個字符時,文本自動向右滾動垂直滾動(Verticalscroll)垂直滾動,僅對多行編輯框有效自動垂直滾動(AutoVScroll)當用戶在最后一行按【Enter】鍵時,文本自動向上滾動一頁,僅對多行編輯框有效密碼(Password)選中時,輸入編輯框的字符都將顯示為“*”,僅對單行編輯框有效沒有隱藏選擇(Nohideselection)通常情況下,當編輯框失去鍵盤焦點時,被選擇的文本仍然反色顯示。選中時,則不具備此功能OEM轉(zhuǎn)換(OEMconvert)選中時,實現(xiàn)對特定字符集的字符轉(zhuǎn)換需要返回(Wantreturn)選中時,用戶按下【Enter】鍵,編輯框中就會插入一個回車符邊框(Border)選中時,控件的周圍存在邊框大寫(Uppercase)選中時,輸入在編輯框的字符全部轉(zhuǎn)換成大寫形式小寫(Lowercase)選中時,輸入在編輯框的字符全部轉(zhuǎn)換成小寫形式只讀(Read-Only)選中時,防止用戶輸入或編輯文本5.3.1編輯框的屬性和通知消息當編輯框的文本被修改或者滾動時,會向其父窗口發(fā)送一些消息,如表5.3所示。通知消息說
明EN_CHANGE若編輯框中的文本已被修改,在新的文本顯示之后發(fā)送此消息EN_HSCROLL若編輯框的水平滾動條被使用,在更新顯示之前發(fā)送此消息EN_KILLFOCUS編輯框失去鍵盤輸入焦點時發(fā)送此消息EN_MAXTEXT文本數(shù)目達到了限定值時發(fā)送此消息EN_SETFOCUS編輯框得到鍵盤輸入焦點時發(fā)送此消息EN_UPDATE編輯框中的文本已被修改,新的文本顯示之前發(fā)送此消息EN_VSCROLL若編輯框的垂直滾動條被使用,在更新顯示之前發(fā)送此消息5.3.2編輯框的基本操作1.口令設置口令設置在編輯框中不同于一般的文本編輯框,用戶輸入的每個字符都被一個特殊的字符代替顯示,這個特殊的字符稱為口令字符。默認的口令字符是“*”,應用程序可以用成員函數(shù)CEdit::SetPasswordChar
來定義自己的口令字符,其函數(shù)原型如下:voidSetPasswordChar(TCHARch);2.選擇文本在編輯框中編輯文本時,往往需要選定文本作為整體進行各種編輯操作。用戶可以用鼠標或鍵盤來選擇文本。用鼠標來選擇文本的操作方法是:在要選擇的文本的一端按下鼠標左鍵并拖動鼠標,到另一端釋放鼠標左鍵。用鍵盤來選擇文本的方法是:在按光標方向移動鍵的同時,按住【Shift】鍵。5.3.2編輯框的基本操作3.設置編輯框的頁面邊距設置編輯框的頁面邊距可以使文本在編輯框中的顯示更具滿意效果,這在多行編輯框中尤為重要,應用程序可通過調(diào)用成員函數(shù)CEdit::SetMargins來實現(xiàn),這個函數(shù)的原型如下:voidSetMargins(UINTnLeft,UINTnRight);4.剪貼板操作編輯框通過CEdit類的Copy、Paste和Cut成員函數(shù)來實現(xiàn)文本的復制、粘貼、剪切操作,并自動支持鍵盤快捷操作,其對應的快捷鍵分別為【Ctrl+C】、【Ctrl+V】和【Ctrl+X】。若應用程序調(diào)用CEdit::Undo函數(shù),則還可撤銷當前的操作,再調(diào)用一次該函數(shù),即可恢復剛才的操作。例如下面的代碼:if(m_Edit.CanUndo()) m_Edit.Undo();5.3.2編輯框的基本操作5.獲取多行編輯框文本一種是使用DDX/DDV,當將編輯框控件所關聯(lián)的變量類型選定為CString后,則不管多行編輯框的文本有多少都可用此變量來保存,從而能簡單地解決多行文本的讀取。但這種方法不能單獨獲得多行編輯框中的某一行文本。另一種方法是使用編輯框CEdit類的相關成員函數(shù)來獲取文本。例如,下面的代碼將顯示編輯框中第二行的文本內(nèi)容:charstr[100];if(m_Edit.GetLineCount()>=2) //判斷多行編輯框的文本是否有兩行以上{
int
nChars;
nChars=m_Edit.LineLength(m_Edit.LineIndex(1)); //獲取第二行文本的字符個數(shù),0表示第一行,1表示第二行,依此類推。
//LineIndex用于將文本行轉(zhuǎn)換成能被LineLength識別的索引 m_Edit.GetLine(1,str,nChars); //獲取第二行文本
str[nChars]='\0';
MessageBox(str);}5.3.3旋轉(zhuǎn)按鈕控件1.旋轉(zhuǎn)按鈕控件常用的樣式旋轉(zhuǎn)按鈕控件有許多樣式,它們都可以通過旋轉(zhuǎn)按鈕控件屬性對話框進行設置,如圖5.22所示,其中各項的含義見表5.4。5.3.3旋轉(zhuǎn)按鈕控件項
目說
明方向(Orientation)控件放置方向:垂直(Vertical)、水平(Horizontal)。排列(Alignment)控件在伙伴窗口的位置安排:獨立(Unattached)、Right(右邊)、Left(左邊)自動結(jié)伴(Autobuddy)選中此項,自動選擇一個Z-order中的前一個窗口作為控件的伙伴窗口自動結(jié)伴整數(shù)(Setbuddyinteger)選中此項,使控件設置伙伴窗口數(shù)值,這個值可以是十進制或十六進制沒有上千(Nothousands)選中此項,不在每隔三個十進制數(shù)字的地方加上千分隔符換行(Wrap)選中此項,當增加或減小的數(shù)值超出范圍,則從最小值或最大值開始回繞箭頭鍵(Arrowkeys)選中此項,當按下向上和向下方向鍵時,也能增加或減小熱軌跡(Hottrack)選中此項,當光標移過控件時,突出顯示控件的上下按鈕表5.4旋轉(zhuǎn)按鈕控件的樣式屬性選擇“布局”→“Tab次序”菜單命令,或按快捷鍵【Ctrl+D】,此時每個控件的左上方都有一個數(shù)字,表明了當前【Tab】鍵次序,這個次序就是在對話框顯示時按【Tab】鍵所選擇控件的次序。5.3.3旋轉(zhuǎn)按鈕控件2.旋轉(zhuǎn)按鈕控件的基本操作成員函數(shù)SetBase是用來設置其基數(shù)的,這個基數(shù)值決定了伙伴窗口顯示的數(shù)字是十進制還是十六進制。如果成功則返回先前的基數(shù)值,如果給出的是一個無效的基數(shù)則返回一個非零值。函數(shù)的原型如下:int
SetBase(int
nBase);成員函數(shù)SetPos和SetRange分別用來設置旋轉(zhuǎn)按鈕控件的當前位置和范圍,它們的函數(shù)原型如下:int
SetPos(int
nPos);voidSetRange(int
nLower,int
nUpper);如:m_SpinNumber.SetRange(0,100);3.旋轉(zhuǎn)按鈕控件的通知消息旋轉(zhuǎn)按鈕控件的通知消息只有一個:UDN_DELTAPOS,它是在當控件的當前數(shù)值將要改變時向其父窗口發(fā)送的。5.3.4示例:用對話框輸入學生成績【例Ex_Ctrl1SDI】
用對話框輸入學生成績1.添加并設計對話框(1)用MFCAppWizard(exe)創(chuàng)建一個默認的單文檔應用程序Ex_Ctrl1SDI。(2)添加一個新的對話框資源,將ID改為IDD_INPUT,標題為“學生成績輸入”,將對話框字體改為“宋體,9號”。將“OK”和“Cancel”按鈕標題改為“確定”和“取消”。(3)調(diào)整對話框的大小,將“確定”和“取消”按鈕移至對話框的下方,然后顯示對話框網(wǎng)格。向?qū)υ捒蛱砑尤绫?.5所示的控件,調(diào)整控件的位置,結(jié)果如圖5.24所示。
5.3.4示例:用對話框輸入學生成績添加的控件ID標
題其
他
屬
性編輯框IDC_EDIT_NAME—默認編輯框IDC_EDIT_NO—默認編輯框IDC_EDIT_S1—默認旋轉(zhuǎn)按鈕控件IDC_SPIN_S1—自動結(jié)伴,靠右排列編輯框IDC_EDIT_S2—默認旋轉(zhuǎn)按鈕控件IDC_SPIN_S2—自動結(jié)伴,設置結(jié)伴整數(shù),靠右排列編輯框IDC_EDIT_S3—默認旋轉(zhuǎn)按鈕控件IDC_SPIN_S3—自動結(jié)伴,設置結(jié)伴整數(shù),靠右排列表5.5學生成績輸入對話框添加的控件5.3.4示例:用對話框輸入學生成績(4)選擇“布局”→“Tab次序”菜單命令,或按快捷鍵【Ctrl+D】,此時每個控件的左上方都有一個數(shù)字,表明了當前【Tab】鍵次序,這個次序就是在對話框顯示時按【Tab】鍵所選擇控件的次序。(5)單擊對話框中的控件,重新設置控件的【Tab】鍵次序,以保證旋轉(zhuǎn)按鈕控件的【Tab】鍵次序在相對應的編輯框(伙伴窗口)之后,結(jié)果如圖5.25所示,單擊對話框或按【Enter】鍵結(jié)束TabOrder方式。(6)雙擊對話框模板空白處,為該對話框模板創(chuàng)建一個對話框類CInputDlg。5.3.4示例:用對話框輸入學生成績2.完善CInputDlg類代碼(1)在MFCClassWizard的MemberVariables頁面中,確定Classname中是否已選擇了CInputDlg,選中所需的控件ID,雙擊鼠標或單擊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示例:用對話框輸入學生成績(2)在MFCClassWizard的MesssageMaps頁面中,為CInputDlg添加WM_INITDIALOG消息映射,并添加下列代碼:BOOLCInputDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_spinScore1.SetRange(0,100); //設置旋轉(zhuǎn)按鈕控件范圍 m_spinScore2.SetRange(0,100); m_spinScore5.SetRange(0,100); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol}5.3.4示例:用對話框輸入學生成績(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示例:用對話框輸入學生成績3.調(diào)用對話框(1)打開Ex_Ctrl1SDI單文檔應用程序的菜單資源,添加頂層菜單項“測試(&T)”,在其下添加一個菜單項“學生成績輸入(&I)”,ID為ID_TEST_INPUT。(2)用MFCClassWizard為CMainFrame類添加菜單項ID_TEST_INPUT的COMMAND消息映射,取默認的映射函數(shù)名,并添加下列代碼:voidCMainFrame::OnTestInput(){
CInputDlg
dlg; if(IDOK==dlg.DoModal()) //獲取對話框數(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示例:用對話框輸入學生成績(3)在文件MainFrm.cpp的前面添加CInputDlg類的頭文件包含:#include"Ex_Ctrl1SDI.h"#include"MainFrm.h"#include"InputDlg.h"(4)編譯并運行,在應用程序的菜單上,選擇“測試”→“學生成績輸入”菜單項,將彈出如圖5.23所示的對話框。單擊成績1的旋轉(zhuǎn)按鈕控件將以0.5的增量來改變它的伙伴窗口的數(shù)值。5.4列表框5.4.1列表框的樣式和消息列表框還有一系列其他樣式,用來定義列表框的外觀及操作方式,這些樣式可在如
圖5.27所示的列表框?qū)傩詫υ捒蛑性O置。
5.4.1列表框的樣式和消息表5.7列出了各樣式(Style)的含義。項
目說
明選擇(Selection)指定列表框的類型:單個(Single)、多選(Multiple)、擴展多選(Extended)、不選(None)所有者繪制(Ownerdraw)自畫列表框,默認為No有字符串(Hasstrings)選中時,在自畫列表框中的項目中含有字符串文本邊框(Border)選中時,使列表框含有邊框分類(Sort)選中時,列表框的項目按字母順序排列通知(Notify)選中時,當用戶對列表框操作,就會向父窗口發(fā)送通知消息多列(Multi-column)選中時,指定一個可水平滾動的多列列表框水平滾動(Horizontalscroll)選中時,在列表框中創(chuàng)建一個水平滾動條垂直滾動(Verticalscroll)選中時,在列表框中創(chuàng)建一個垂直滾動條不刷新屏幕(Noredraw)選中時,列表框發(fā)生變化后不會自動重畫使用制表站(位)(Usetabstops)選中時,允許使用停止位來調(diào)整列表項的水平位置需要鍵輸入(Wantkeyinput)選中此項,當用戶按鍵且列表框有輸入焦點時,就會向列表框的父窗口發(fā)送相應消息禁止不滾動(Disablenoscroll)選中時,即使列表框的列表項能全部顯示,垂直滾動條也會顯示,但此時是禁用的(灰顯)沒有完整高度(Nointegralheight)選中時,在創(chuàng)建列表框的過程中,系統(tǒng)會把用戶指定的尺寸完全作為列表框的尺寸,而不管是否會有項目在列表框中不能完全顯示出來5.4.1列表框的樣式和消息當列表框中發(fā)生了某個動作,如雙擊選擇了列表框中某一項時,列表框就會向其父窗口發(fā)送一條通知消息。常用的通知消息如表5.8所示。通知消息說
明LBN_DBLCLK用戶雙擊列表框的某項字符串時發(fā)送此消息LBN_KILLFOCUS列表框失去鍵盤輸入焦點時發(fā)送此消息LBN_SELCANCEL當前選擇項被取消時發(fā)送此消息LBN_SELCHANGE列表框中的當前選擇項將要改變時發(fā)送此消息LBN_SETFOCUS列表框獲得鍵盤輸入焦點時發(fā)送此消息5.4.2列表框的基本操作1.添加列表項列表框創(chuàng)建時是一個空的列表,需要用戶添加或插入一些列表項。CListBox類成員函數(shù)AddString
和InsertString
分別用來向列表框增加列表項,其函數(shù)原型如下:int
AddString(LPCTSTRlpszItem);int
InsertString(int
nIndex,LPCTSTRlpszItem);上述兩個函數(shù)只能將字符串增加到列表框中,但有時用戶還會需要根據(jù)列表項使用其他數(shù)據(jù)。這時,就需要調(diào)用CListBox的SetItemData和SetItemDataPtr,它們能使用戶數(shù)據(jù)和某個列表項關聯(lián)起來。int
SetItemData(int
nIndex,DWORDdwItemData);int
SetItemDataPtr(int
nIndex,void*pData);5.4.2列表框的基本操作2.刪除列表項CListBox類成員函數(shù)DeleteString和ResetContent分別用來刪除指定的列表項和清除列表框所有項目。它們的函數(shù)原型如下:int
DeleteString(UINTnIndex); //nIndex指定要刪除的列表項的索引voidResetContent();3.查找列表項為了保證列表項不會重復地添加在列表框中,有時還需要對列表項進行查找。CListBox類成員函數(shù)FindString
和FindStringExact分別用來在列表框中查找所匹配的列表項。其中,F(xiàn)indStringExact的查找精度最高。int
FindString(int
nStartAfter,LPCTSTRlpszItem)const;int
FindStringExact(int
nIndexStart,LPCTSTRlpszFind)const;5.4.2列表框的基本操作4.列表框的單項選擇當選中列表框中某個列表項后,用戶可以使用CListBox::GetCurSel來獲取這個結(jié)果,與該函數(shù)相對應的CListBox::SetCurSel
函數(shù)用來設定某個列表項呈選中狀態(tài)(高亮顯示)。int
GetCurSel()const; //返回當前選擇項的索引int
SetCurSel(int
nSelect);若要獲取某個列表項的字符串,可使用下列函數(shù):int
GetText(int
nIndex,LPTSTRlpszBuffer)const;voidGetText(int
nIndex,CString&rString)const;5.4.2列表框的基本操作5.列表框的多項選擇當在列表框的Style屬性對話框中選中多選(Multiple)或擴展多選(Extended)類型后,就可以在列表框中進行多項選擇。要想獲得選中的多個選項,需要用MFCClassWizard映射列表框控件的LBN_SELCHANGE消息,并添加類似下面的一些代碼:voidCListBoxDlg::OnSelchangeList1(){
int
nCount=m_list.GetSelCount(); //獲取用戶選中的項數(shù) if(nCount==LB_ERR)return;
int*buffer=newint[nCount]; //開辟緩沖區(qū)
m_list.GetSelItems(nCount,buffer);//將各個選項的索引號內(nèi)容存放在緩沖區(qū)中
CString
allStr=NULL,str; for(inti=0;i<nCount;i++) {
m_list.GetText(buffer[i],str); //獲得各個索引的項目文本
allStr=allStr+"["+str+"]"; //處理項目文本 } delete[]buffer; //釋放內(nèi)存 //MessageBox(allStr); //處理獲得的文本}5.4.3示例:城市郵政編碼在一組城市郵政編碼中,城市名和郵政編碼是一一對應的。為了能添加和刪除城市郵政編碼列表項,需要設計一個這樣的對話框,如圖5.28所示。5.4.3示例:城市郵政編碼【例Ex_Ctrl2SDI】創(chuàng)建并使用城市郵政編碼對話框1.添加并設計對話框(1)用MFCAppWizard(exe)創(chuàng)建一個默認的單文檔應用程序Ex_Ctrl2SDI。(2)向應用程序中添加一個對話框資源IDD_CITYZIP,標題定為“城市郵政編碼”,字體設為“宋體,9號”,創(chuàng)建此對話框類為CCityDlg。刪除原來的“Cancel”按鈕,將“OK”按鈕的標題改為“退出”。(3)打開對話框網(wǎng)格,參看圖5.28的控件布局,用編輯器為對話框添加如表5.9所示的一些控件。添加的控件ID標
題其
他
屬
性列表框IDC_LIST1—默認編輯框(城市名)IDC_EDIT_CITY—默認編輯框(郵政編碼)IDC_EDIT_ZIP—默認按鈕(添加)IDC_BUTTON_ADD添加默認按鈕(修改)IDC_BUTTON_DEL修改默認5.4.3示例:城市郵政編碼2.完善CCityDlg類代碼(1)打開ClassWizard的MemberVariables頁面,看看Classname是否是CCityDlg,然后選中所需的控件ID,雙擊鼠標或單擊AddVariables按鈕,依次為下列控件增加成員變量,如表5.10所示。控件ID變
量
類
別變
量
類
型變
量
名范圍和大小IDC_LIST1ControlCListBoxm_ListBox-—IDC_EDIT_CITYValueCStringm_strCity40IDC_EDIT_ZIPValueDWORDm_dwZipCode100000~9999995.4.3示例:城市郵政編碼(2)將項目工作區(qū)切換到ClassView頁面,右擊CCityDlg類名,從彈出的快捷菜單中選擇“AddMemberFunction”,彈出“添加成員函數(shù)”對話框,在“函數(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頁面,在此為對話框添加WM_INITDIALOG消息映射,并增加下列代碼:BOOLCCityDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_dwZipCode=100000; //設置初始的郵政編碼 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(當前選擇項發(fā)生改變發(fā)生的消息)的消息映射,并增加下列代碼。這樣,當單擊列表框的城市名時,將會在編輯框中顯示出城市名和郵政編碼。voidCCityDlg::OnSelchangeList1(){ intnIndex=m_ListBox.GetCurSel(); if(nIndex!=LB_ERR) { m_ListBox.GetText(nIndex,m_strCity); m_dwZipCode=m_ListBox.GetItemData(nIndex); UpdateData(FALSE);//使用當前列表項所關聯(lián)的內(nèi)容顯示在控件上 GetDlgItem(IDC_BUTTON_DEL)->EnableWindow(TRUE); }}5.4.3示例:城市郵政編碼3.調(diào)用對話框(1)打開Ex_Ctrl2SDI單文檔應用程序的菜單資源,添加頂層菜單項“測試(&T)”,在其下添加一個菜單項“城市郵政編碼(&C)”,ID為ID_TEST_CITY。(2)用MFCClassWizard為CMainFrame類添加菜單項ID_TEST_CITY的COMMAND消息映射,取默認的映射函數(shù)名,并添加下列代碼:voidCMainFrame::OnTestCity(){
CCityDlg
dlg;
dlg.DoModal();}(3)在文件MainFrm.cpp的前面添加CCityDlg類的頭文件包含:#include"MainFrm.h"#include"CityDlg.h"(4)編譯運行后,在應用程序的菜單上,選擇“測試”→“城市郵政編碼”菜單項,將彈出如圖5.28所示的對話框。5.5組合框5.5.1組合框的樣式類型和消息按照組合框的主要樣式特征,可把組合框分為3類:簡單組合框、下拉式組合框、下拉式列表框,如圖5.29所示。組合框還有其他一些樣式,這些樣式可在如圖5.30所示的組合框的屬性對話框中設置。
5.5.1組合框的樣式類型和消息其各項含義見表5.11。項
目說
明類型(Type)設置組合框的類型:Simple(簡單)、Dropdown(下拉)、DropList(下拉列表框)所有者繪制(Ownerdraw)自畫組合框,默認為No有字符串(Hasstrings)選中時,在自畫組合框中的項目中含有字符串文本分類(Sort)選中時,組合框的項目按字母順序排列垂直滾動(Verticalscroll)選中時,在組合框中創(chuàng)建一個垂直滾動條沒有完整高度(Nointegralheight)選中時,在創(chuàng)建組合框的過程中,系統(tǒng)會把用戶指定的尺寸完全作為組合框的尺寸,而不管是否會有項目在組合框中的列表中不能完全顯示出來OEM轉(zhuǎn)換(OEMconvert)選中時,實現(xiàn)對特定字符集的字符轉(zhuǎn)換自動水平滾動(AutoHScroll)當用戶在行尾輸入一個字符時,文本自動向右滾動禁止不滾動(Disablenoscroll)選中時,即使組合框的列表項能全部顯示,垂直滾動條也會顯示,但此時是禁用的(灰顯)大寫字母(Uppercase)選中時,輸入在編輯框的字符全部轉(zhuǎn)換成大寫形式小寫字母(Lowercase)選中時,輸入在編輯框的字符全部轉(zhuǎn)換成小寫形式5.5.1組合框的樣式類型和消息在組合框的通知消息中,有的是列表框發(fā)出的,有的是編輯框發(fā)出的,如表5.12所示。通知消息說
明CBN_CLOSEUP當組合框的列表關閉時發(fā)送此消息CBN_DBLCLK用戶雙擊組合框的某項字符串時發(fā)送此消息CBN_DROPDOWN當組合框的列表打開時發(fā)送此消息CBN_EDITCHANGE同編輯框的EN_CHANGE消息CBN_EDITUPDATE同編輯框的EN_UPDATE消息CBN_SELENDCANCEL當前選擇項被取消時發(fā)送此消息CBN_SELENDOK當用戶選擇一個項并按下【Enter】鍵或單擊下拉箭頭
()隱藏列表框時發(fā)送此消息CBN_KILLFOCUS組合框失去鍵盤輸入焦點時發(fā)送此消息CBN_SELCHANGE組合框中的當前選擇項將要改變時發(fā)送此消息CBN_SETFOCUS組合框獲得鍵盤輸入焦點時發(fā)送此消息5.5.2組合框常見操作組合框的操作大致分為兩類,一類是對組合框中的列表框進行操作,另一類是對組合框中的編輯框進行操作。這些操作都可以通過調(diào)用CComboBox成員函數(shù)來實現(xiàn),見表5.13。5.5.3示例:城市郵政編碼和區(qū)號在前面的【例Ex_Ctrl2SDI】示例中,只是簡單涉及了城市名和郵政編碼的對應關系。實際上,城市名還和區(qū)號一一對應,為此本例需要設計這樣的對話框,如圖5.31所示。5.5.3示例:城市郵政編碼和區(qū)號【例Ex_Ctrl3SDI】創(chuàng)建并使用城市郵政編碼和區(qū)號對話框1.添加并設計對話框(1)用MFCAppWizard(exe)創(chuàng)建一個默認的單文檔應用程序Ex_Ctrl3SDI。(2)向應用程序中添加一個對話框資源IDD_CITYZONE,標題定為“城市郵政編碼和區(qū)號”,字體設為“宋體,9號”,創(chuàng)建此對話框類為CCityZoneDlg。刪除原來的“Cancel”按鈕,將“OK”按鈕標題改為“退出”。(3)打開對話框網(wǎng)格,參看圖5.31的控件布局,為對話框添加如表5.14所示的一些控件。添加的控件ID標
題其
他
屬
性組合框IDC_COMBO1—默認編輯框(郵政編碼)IDC_EDIT_ZIP—默認編輯框(區(qū)號)IDC_EDIT_ZONE—默認按鈕(添加)IDC_BUTTON_ADD添加默認按鈕(修改)IDC_BUTTON_CHANGE修改默認5.5.3示例:城市郵政編碼和區(qū)號在組合框添加到對話框模板后,一定要單擊組合框的下拉按鈕(),然后調(diào)整出現(xiàn)的下拉框大小,如圖5.32所示,否則組合框可能因為下拉框太小而無法顯示其下拉列表項。下拉框
5.5.3示例:城市郵政編碼和區(qū)號2.完善CCityZoneDlg類代碼(1)打開MFCClassWizard的MemberVariables頁面,看看Classname是否是CCityZoneDlg,然后選中所需的控件ID,雙擊鼠標或單擊AddVariables按鈕。依次為下列控件增加成員變量,如表5.15所示??丶蘒D變
量
類
別變
量
類
型變
量
名范圍和大小IDC_COMBO1ControlCComboBoxm_ComboBox-—IDC_COMBO1ValueCstringm_strCity-20IDC_EDIT_ZONEValueCStringm_strZone10IDC_EDIT_ZIPValueCStringm_strZip6(2)將項目工作區(qū)切換到ClassView頁面,右擊CCityZoneDlg類名,從彈出的快捷菜單中選擇“AddMemberFunction”,彈出“添加成員函數(shù)”對話框,在“函數(shù)類型”框中輸入BOOL,在“函數(shù)聲明”框中輸入IsValidate,單擊“確定”按鈕。5.5.3示例:城市郵政編碼和區(qū)號(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ū)號輸入無效!"); returnFALSE; } returnTRUE;}5.5.3示例:城市郵政編碼和區(qū)號(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ū)號合并為一個字符串 m_ComboBox.SetItemDataPtr(nIndex,newCString(strData)); }5.5.3示例:城市郵政編碼和區(qū)號(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ū)號(6)用MFCClassWizard為組合框IDC_COMBO1添加CBN_SELCHANGE(當前選擇項發(fā)生改變時發(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個字符 m_strZone=strData.Mid(n+1);//從中間第n+1個字符到末尾的字符串
UpdateData(FALSE); }}5.5.3示例:城市郵政編碼和區(qū)號(7)用MFCClassWizard為對話框添加WM_DESTROY的消息映射,并增加下列代碼:voidCCityZoneDlg::OnDestroy() //此消息是當對話框關閉時發(fā)送的{ for(intnIndex=m_ComboBox.GetCount()-1;nIndex>=0;nIndex--) { //刪除所有與列表項相關聯(lián)的CString數(shù)據(jù),并釋放內(nèi)存 delete(CString*)m_ComboBox.GetItemDataPtr(nIndex); } CDialog::OnDestroy();}5.5.3示例:城市郵政編碼和區(qū)號3.調(diào)用對話框(1)打開Ex_Ctrl3SDI單文檔應用程序的菜單資源,添加頂層菜單項“測試(&T)”,在其下添加一個菜單項“城市郵政編碼和區(qū)號(&Z)”,ID為ID_TEST_CITYZONE。(2)用MFCClassWizard為CMainFrame類添加菜單項ID_TEST_CITYZONE的COMMAND消息映射,取默認的映射函數(shù)名,并添加下列代碼:voidCMainFrame::OnTestCityzone(){
CCityZoneDlg
dlg;
dlg.DoModal();}(3)在文件MainFrm.cpp的前面添加CCityZoneDlg類的頭文件包含:#include"MainFrm.h"#include"CityZoneDlg.h"(4)編譯運行并測試。5.6進展條、滾動條和滑動條5.6.1進展條進展條(進程條)是一個如圖5.33所示的控件。除了能表示一個過程的進展情況外,使用進展條還可表明溫度、水平面或類似的測量值。5.6.1進展條1.進展條的樣式打開進展條的屬性對話框,如圖5.34所示,可以看到它的樣式屬性并不是很多。5.6.1進展條2.進展條的基本操作進展條的基本操作有設置其范圍、當前位置、增量等。這些操作都是通過CProgressCtrl類的相關成員函數(shù)來實現(xiàn)的。int
SetPos(int
nPos);int
GetPos();這兩個函數(shù)分別用來設置和獲取進展條的當前位置。需要說明的是,這個當前位置是指在SetRange中的上限和下限范圍之間的位置。voidSetRange(shortnLower,shortnUpper);voidSetRange32(intnLower,int
nUpper);voidGetRange(int&nLower,int&nUpper);5.6.1進展條3.使用進展條示例該示例的對話框中有一個進展條、一個靜態(tài)文本和三個按鈕。如圖5.35所示,單擊“繼續(xù)”按鈕,進展條向前進,單擊“后退”按鈕,進展條向后退,靜態(tài)文本中還顯示出進展條的百分比。5.6.1進展條【例Ex_Ctrl4SDI】創(chuàng)建并使用進展條對話框1.添加并設計對話框(1)用MFCAppWizard(exe)創(chuàng)建一個默認的單文檔應用程序Ex_Ctrl4SDI。(2)向應用程序中添加一個對話框資源IDD_PROGRESS,標題定為“進展條對話框”,字體設為“宋體,9號”,創(chuàng)建此對話框類為CProgressDlg。刪除原來的“Cancel”按鈕,將“OK”按鈕的標題改為“退出”。(3)打開對話框網(wǎng)格,用編輯器為對話框添加如表5.16所示的一些控件,調(diào)整控件的位置,結(jié)果參見圖5.35。添加的控件ID標
題其
他
屬
性靜態(tài)文本IDC_STATIC_TEXT默認對齊設為Center,其余默認進展條IDC_PROGRESS1—默認按鈕(后退)IDC_BUTTON_BACK—默認按鈕(繼續(xù))IDC_BUTTON_GOON—默認5.6.1進展條2.完善CProgressDlg類代碼(1)打開ClassWizard的MemberVariables頁面,看看Classname是否是CProgressDlg,選中控件ID(IDC_STATIC_TEXT),雙擊鼠標或單擊AddVariables按鈕,為其添加一個CString類型變量m_strPercent。再為進展條IDC_PROGRESS1控件添加一個CProgressCtrl類變量m_Progress。(2)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學校消防安全責任書3
- 高考語文作文主題講解之 反思反省
- 小學二年級數(shù)學課件
- 安全防火課件教學課件
- 小學美術(shù)課件教學課件
- 汽車涂裝技術(shù)(彩色版配實訓工單)課件 任務一 認知汽車涂裝技術(shù)
- 冷鏈海鮮配送協(xié)議
- 商鋪門頭涂料翻新服務協(xié)議
- 書店裝修顧問協(xié)議
- 主題餐廳裝修材料訂購協(xié)議
- 足球變向運球教學課件
- 保密工作自查自評打分表
- 數(shù)字電路說課(應用電子)課件
- (完整版)婦產(chǎn)科案例分析(含答案)
- 部編版小學道德與法治五年級上冊單元檢測試題全冊含答案
- 《中醫(yī)美容》期末考試題庫(含答案)
- 定人定崗定責實施方案(共11篇)
- 醫(yī)院酒精泄漏應急預案演練
- 非心臟手術(shù)圍手術(shù)期心血管危險評估和管理
- 四年級數(shù)學上冊第七單元整數(shù)四則混合運算第1課時不含括號的混合運算教案蘇教版
- 維護國家安全 教案設計
評論
0/150
提交評論