第13章windows標準控件_第1頁
第13章windows標準控件_第2頁
第13章windows標準控件_第3頁
第13章windows標準控件_第4頁
第13章windows標準控件_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第13章

Windows標準控件在可視化編程中的應用1控件是Windows圖形用戶界面的主要組成部分之一,用戶通過操作控件對象完成與應用程序之間的交互??丶氖褂眉畜w現(xiàn)了Windows系統(tǒng)面向對象的特點213.1概述控件工具欄控件接受的消息主要有單擊、雙擊和字符輸入等313.2按鈕控件及其應用按鈕控件普通按鈕圓按鈕復選框按鈕組框按鈕自繪按鈕

413.2.1按鈕控件的創(chuàng)建過程

CButton類的成員函數(shù)Create負責創(chuàng)建按鈕控件,該函數(shù)的聲明為:

BOOLCreate(LPCTSTRlpszCaption,//指定了按鈕顯示的正文

DWORDdwStyle, //按鈕的風格

constRECT&rect, //按鈕的位置和大小

CWnd*pParentWnd, //指向父窗口,UINTnID //按鈕的ID

)5按鈕控件消息:ON_BN_CLICKEDON_BN_DBLCLICKEDON_COMMAND兩個類似按鈕是最常見的控件之一復選框單選按鈕下壓式按鈕分組框常用于顯示一組選項供用戶選擇適用于同一組屬性相同的數(shù)據中選一個數(shù)據適用于消息的發(fā)送沒有太多的操作只是在窗口中劃分區(qū)域范圍6GetCheck()SetCheck()GetBitmap()SetBitmap()GetButtonStyle()SetButtonStyle()GetCursor()SetCursor()GetIcon()SetIcon()GetState()SetState()CButton類的成員函數(shù)在知道按鈕ID的前提下,還可使用與按鈕有關的CWnd成員函數(shù)來設置或查詢按鈕狀態(tài)CheckDlgButtonCheckRadioButtonGetCheckedRadioButtonIsDlgButtonCheckedGetWindowTexGetWindowTextLengthSetWindowText7MFC還提供了一個CBitmapButton的類,允許用戶以圖標的方式顯示按鈕,它是在CButton下派生的

MFC調用方法DrawItem()在按鈕上繪制位圖,LoadBitmaps()方法為一個CBitmapButton對象附上位圖,最多可以有4個位圖自定義按鈕813.2.2按鈕控件示例

9Group屬性Auto屬性主要步驟:創(chuàng)建基于對話框項目設置按鈕的屬性103.添加成員變量并添加消息響應函數(shù)11voidCMy13_1Dlg::OnButton1(){ m_btn1.SetWindowText(“你已按下了按鈕!”);}voidCMy13_1Dlg::OnButton2(){ m_btn2.SetWindowText(“按鈕已被按下!”);}voidCMy13_1Dlg::OnCheck1(){ if(m_chk1.GetCheck()>0)m_chk1.SetCheck(0);elsem_chk1.SetCheck(1);}voidCMy13_1Dlg::OnRadio1(){ m_rad1.SetCheck(1);}1213.3滾動條控件

滾動條是一個交互式的、高度可視化的控件它包括一個滑塊、滾動條的兩端的按鈕等。滾動條控件與屬于窗口的滾動條是不一樣的處于窗口的滾動條是由該窗口創(chuàng)建、管理和釋放的滾動條控件是由用戶創(chuàng)建、管理和釋放的1313.3.1滾動條類的結構及其方法

滾動條可以通過通知代碼來創(chuàng)建,也可以用對話框資源模板來創(chuàng)建1413.3.2創(chuàng)建與初始化滾動條類

創(chuàng)建CScrollBar對象的一般步驟(1)用C++關鍵字new和構造函數(shù)CScrollBar::CScrollBar()為一個ScrollBar對象分配一個實例(2)初始化CScrollBar對象,將一個Windows滾動條賦予它,并用CScroll::Create()方法設置參數(shù)和樣式分配一個滾動條控件對象并返回指向該對象的指針CScrollBar::pMyScroll=newCScrollBar調用CScrollBar::Create()方法初始化指針BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);滾動條窗口的樣式表示控件的大小和位置指向控件所屬窗口的指針父窗口與滾動條通信的標識15在設置滾動條控件時,要通過如下方法設置其范圍CScrollBar::SetScrollRange()例如,設置滾動范圍為-100到100的垂直滾動條pMyScroll->SetScrollRange(SB_VERT,-100,100);通過SetScrollPos()設置滾動塊當前位置例如,滾動塊的位置在-100到100的中間,即為0的位置pMyScroller->SetScrollPos(0);1613.3.3滾動條類編程實例

標題為ApplicationofScrollBar滾動條的滾動范圍設為0到20單擊滾動塊與箭頭之間的區(qū)域。滾動塊上移或下移三格,編輯框中的數(shù)字加3或減3單擊向上或向下的箭頭,滾動塊向上或向下移動一格,編輯框中的數(shù)字加1或減1按住滾動塊上下拖動。編輯框中的數(shù)字隨著隨之變化當前值為10單擊Up按鈕,滾動塊移到最上邊,編輯框的數(shù)字變?yōu)?單擊Down按鈕,滾動塊移到最下邊,編輯框的數(shù)字變?yōu)?0單擊Reset按鈕,滑塊移到中間,編輯框的數(shù)字變?yōu)?0單擊Exit按鈕,退出應用程序17(1)應用程序的可視化編程部分18(2)應用程序的代碼編程部分(a)給滾動條連接變量ID 變量名 類別 類型 IDC_SCROLLBAR m_Scrollbar Control CScrollbarIDC_EDITl m_Edit Control CEdit19BOOLCMy13_2Dlg::OnInitDialog(){CDialog::OnInitDialog();……

m_Scrollbar.SetScrollRange(0,20); m_Scrollbar.SetScrollPos(10); charsPos[10];//將整數(shù)轉為字符串 itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); UpdateData(FALSE); returnTRUE;}10進制數(shù)(b)初始化滾動條20(3)給滾動條消息添加代碼voidCMy13_2Dlg::OnVScroll(……){ charsPos[10]; intiNowPos; switch(nSBCode) {if(pScrollBar==&m_Scrollbar) { caseSB_THUMBTRACK: //拖動滑塊 m_Scrollbar.SetScrollPos(nPos); itoa(nPos,sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos);21caseSB_LINEDOWN: //單擊滾動條向下的箭頭 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos+1; if(iNowPos>20) iNowPos=20; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break;22caseSB_LINEUP: //單擊滾動條向上的箭頭 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos-1; if(iNowPos<0) iNowPos=0; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break;23caseSB_PAGEDOWN: //單擊箭頭與滾塊之間的區(qū)域 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos+3; if(iNowPos>20) iNowPos=20; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break;24caseSB_PAGEUP: //單擊箭頭與滾塊之間的區(qū)域 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos-3; if(iNowPos<0) iNowPos=0; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break; } } CDialog::OnVScroll(nSBCode,nPos,pScrollBar);}25(4)給Exit按鈕連接代碼

voidCMy13_2Dlg::OnExitButton(){

OnOK();}(5)給Up按鈕添代碼voidCMy13_2Dlg::OnUpButton(){

m_Scrollbar.SetScrollPos(0); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel("0");}26(6)給Down按鈕添加代碼voidCMy13_2Dlg::OnDownButton(){m_Scrollbar.SetScrollPos(20); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel("20"); }(7)給Reset按鈕添加代碼voidCMy13_2Dlg::OnResetButton(){m_Scrollbar.SetScrollPos(10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel("10"); }27在應用程序中,編輯框只是有于顯示滾動塊的位置,不需要進行編輯,因此必須將其屬性改為只讀2813.4編輯框控件

編輯框控件看起來是個非常簡單的矩形窗口,但它具有許多功能,編輯框控件可以自帶滾動條,顯示多行文本。CEdit是CWnd類直接派生來的,這就意味著它具有CWnd的所有功能

編輯框控件單行編輯框控件多行編輯框控件2913.4.1編輯框類常用方法303113.4.2編輯框與應用程序間的消息傳遞

編輯框通過向其父窗口發(fā)送WM_COMMAND消息通知應用程序用戶的交互信息

應用程序對編輯框的操作通過調用函數(shù)SendMessage或SendDlgItemMessage

3213.4.3編輯類編程實例

單擊Showl,則在Edit1編輯框中顯示“ThisisthefirstEditBox.”單擊Clear1,則Edit1編輯框中的內容被清除;單擊Show2,則在Edit2編輯框中顯示“ThisisthesecondEditBox!”單擊Clear2,則Edit2編輯框中的內容被清除;單擊Transfer,則把Edit1編輯框的內容復制到Edit2的編輯框中去單擊Undo,則取消上一次操作若單擊Exit,則退出程序的運行33具體的編程過程生成了工程文件和工程工作區(qū)文件后在EditBox的工作區(qū)中選擇ResourceView因為本應用程序是基于對話框的,由向導生成對話框窗口作為應用程序的主窗口,并且給這個對話框取名為IDD_EDITBOX_DIALOG,然后在這個對話框窗口中進行界面設計34(1)創(chuàng)建資源:在ResourceView選項卡中打開Dialog資源組,然后雙擊IDD_EDITBOX_DIALOG。VC在工作臺中顯示可以進行可視化編輯的IDD_EDITBOX_DIALOG對話框把鼠標停在編輯框控件上,即可顯示該控件的類型控件工具窗提供了VC中所有可建立的控件類型35(2)設置控件ID將鼠標移到Edit1控鍵上-->單擊鼠標右鍵,選擇Properties命令,在窗口中輸入控件的ID標識值,IDC_EDIT1,用同樣的方法設置其它各個對象的屬性36(3)應用程序的代碼編程部分(a)給編輯框連接變量37(b)設置成員變量名為m_Edit1,類別為Control,變量類型為CEdit注意,不要將m_Edit1設為CString類型,因為只有設為CEdit類型,才能夠調用CEdit類中的一些成員函數(shù),如Copy,Paste等,這樣才能完成本應用程序中對Transfer按鈕要求復制內容的操作的響應38用同樣的方法給編輯框EDIT2等其它對象連接各自的變量,增加變量之后MFCClassWizard窗口將變?yōu)橄聢D所示39若此時運行該程序,在Edit文本框中不能進行多行輸入,只能單行輸入文本,而且按回車鍵終止應用程序,同時,文本框中也沒有水平和垂直滾動條。下面,我們來完善應用程序中編輯框的特性,使之能夠進行多行文本的輸入40(c)修改編輯框的特性41(4)添加代碼voidCMy13_5Dlg::OnShow1Button(){m_Edit1.SetSel(0,-1);//選中編輯框IDC_EDIT1中的全部內容m_Edit1.ReplaceSel("ThisisthefirstEditBox.");}

程序中SetSel()函數(shù)是CEdit類中的成員函數(shù),因為m_Edit1是屬于CEdit類的對象,故可以調用該類所有的成員函數(shù)。ReplaceSel()函數(shù)也是CEdit類中成員函數(shù)。(a)給Showl按鈕連接代碼42(2)給Clear1按鈕連接代碼voidCMy13_5Dlg::OnClear1Button(){m_Edit1.SetSel(0,-1); //選中IDC_EDIT1中的內容m_Edit1.ReplaceSel(""); //用空串代替所選文本,即把所選的文本刪除}43voidCMy13_5Dlg::OnShow2Button(){m_Edit2.SetSel(0,-1); m_Edit2.ReplaceSel("ThisisthesecondEditBox.");}voidCMy13_5Dlg::OnClear2Button(){m_Edit2.SetSel(0,-1);m_Edit2.ReplaceSel("");}(3)給Show2和Clear2按鈕連接代碼44(4)給按鈕IDC_Transfer_BUTTON連接代碼voidCMy13_5Dlg::OnTransferButton(){m_Edit1.SetSel(0,-1);m_Edit1.Copy();m_Edit2.SetSel(0,-1);m_Edit2.ReplaceSel("");m_Edit2.Paste();}45(5)給Undo按鈕連接代碼voidCMy13_5Dlg::OnUndoButton(){m_Edit1.Undo(); m_Edit2.Undo();}(6)給Exit按鈕連接代碼voidCMy13_5Dlg::OnExitButton(){OnOK(); }46【例13-6】“乘法器”示例程序,使用者在“乘數(shù)”或者“被乘數(shù)”編輯框中輸入數(shù)字的時候,程序可以隨時計算乘法的結果

ID Type Member Read-only NumberIDC_EDIT_MUL1 int m_A √ IDC_EDIT_MUL2 int m_B √IDC_EDIT_RESULTCStringm_Result √ √47初始化結果編輯框BOOLCMy13_6Dlg::OnInitDialog(){

CDialog::OnInitDialog(); ……

UpdateData(TRUE);

inti=m_A*m_B; m_Result.Format("%d",i);

UpdateData(FALSE); returnTRUE;}

48(2)當編輯框中的內容發(fā)生改變時,會產生EN_CHANGE消息,需要為乘數(shù)與被乘數(shù)兩個編輯框響應該消息voidCMy13_6Dlg::OnChangeEditMul1(){ UpdateData(TRUE); inti=m_A*m_B; m_Result.Format("%d",i); UpdateData(FALSE);}

voidCMy13_6Dlg::OnChangeEditMul2(){ UpdateData(TRUE); inti=m_A*m_B; m_Result.Format("%d",i); UpdateData(FALSE);}49(3)響應Reset按鈕的消息voidCMy13_6Dlg::OnReset(){ m_A=0; m_B=0; inti=m_A*m_B; m_Result.Format("%d",i); UpdateData(FALSE);}

5013.5組合框控件

5113.5.1組合框(CComboBox)類的結構及組合框的特點

組合框是兩種預定義窗口的組合形式。

在Windows編程中使用單一控件往往不能完全滿足與用戶交互的需要,最常見的組合框例子是對話框及與其相聯(lián)系的靜態(tài)文本和編輯框。5213.5.2組合框與應用程序間消息傳遞

組合框通過向其父窗口發(fā)關WM_COMMAND消息通知應用程序用戶的交互信息。應用程序對組合框的操作也通過使用函數(shù)SendMessage或SendDlgItemMessage向組合框發(fā)送消息進行。由于對組合框的操作實際上是對組合框中各成員的操作。

5313.5.3組合框控件應用舉例

【例13-7】本例創(chuàng)建組合框控件,當單擊向下按鈕時,顯示可選文件的名字。當選中某一項時,顯示該項的名稱

54將一個ComboBox控件放到對話框上。取消Sort風格。否則插入的內容將按照字母順序排序,而不是插入的順序排序。添加CComboBox類型的變量m_cbBOOLCMy13_7Dlg::OnInitDialog()//初始化對話框{ CDialog::OnInitDialog(); …… //TODO:Addextrainitializationhere m_cb.AddString("Monday"); m_cb.AddString("Tuesday"); m_cb.AddString("Wednesday"); m_cb.AddString("Thursday"); m_cb.AddString("Friday"); m_cb.AddString("Saturday"); m_cb.AddString("Sunday"); returnTRUE;}

55當用戶選擇的內容發(fā)生改變的時候,會產生CBN_SELCHANGE消息。為控件添加該消息的響應函數(shù):voidCMy13_7Dlg::OnSelchangeCombo(){ CStringmsg; m_cb.GetLBText(m_cb.GetCurSel(),msg); AfxMessageBox(msg);}56【例13-8】本程序為幾種控件的綜合應用

57在設計的過程中,同一組單選按鈕必須一個接一個地放進對話框中,中間不能插入其它的控件對于成組的單選按鈕,只在每組的第一個按鈕的屬性中選中Group設置在SexSelecting組中只有Boy單選按鈕選中Group屬性在AgeRange組中只有“>20”單選按鈕選中Group屬性58VisualC++按照放入對話框中的先后順序,給每個控件賦一個ID值,所以控件的ID值是連續(xù)的。Group屬性的控件之間的控件為一組??梢詮膔esource.h的資源頭文件中得到ID值#defineIDC_SHOW_BUTTON1006#defineIDC_HIDE_BUTTON1007#defineIDC_Boy_RADIO1008 #defineIDC_Girl_RADIO1009#defineIDC_Age1_RADIO1010#defineIDC_Age2_RADIO1011#defineIDC_Age3_RADIO1012#defineIDC_Show_Sex_Age_BUTTON1013#defineIDC_Result_EDIT101459在為相關控件連接變量和方法后,開始編程(1)給復選框IDC_DATE_CHECK添加代碼

OnDateCheck()方法的實現(xiàn)代碼如下:voidCMy13_8Dlg::OnDataCheck(){

UpdateData(TRUE); if(m_DateCheck==TRUE) { CTimetNow; tNow=CTime::GetCurrentTime(); CStringsNow=tNow.Format("%y.%m.%d"); m_DateEdit.SetSel(0,-1); m_DateEdit.ReplaceSel(sNow); } else { m_DateEdit.SetSel(0,-1); m_DateEdit.ReplaceSel(""); } UpdateData(FALSE);}以當前的屏幕顯示內容更新控件的變量60(2)為復選框IDC_TIME_CHECK添加代碼

voidCMy13_8Dlg::OnTimeCheck(){ UpdateData(TRUE); if(m_TimeCheck==TRUE) { CTimetNow; tNow=CTime::GetCurrentTime(); CStringsNow=tNow.Format("%I:%M:%S"); m_TimeEdit.SetSel(0,-1); m_TimeEdit.ReplaceSel(sNow); } else { m_TimeEdit.SetSel(0,-1); m_TimeEdit.ReplaceSel(""); } UpdateData(FALSE);}函數(shù)Format的參數(shù)%I是時間的小時表示法(01~12),%m是分的表示法(00~59),%d是秒的表示法(00~59)61

(3)

給Enable按鈕添加代碼voidCMy13_8Dlg::OnEnableButton(){

GetDlgItem(IDC_DATE_CHECK)->EnableWindow(TRUE); GetDlgItem(IDC_TIME_CHECK)->EnableWindow(TRUE); m_DateEdit.EnableWindow(TRUE); m_TimeEdit.EnableWindow(TRUE);}62(4)為Disable按鈕連接代碼voidCMy13_8Dlg::OnDisableButton(){ GetDlgItem(IDC_DATE_CHECK)->EnableWindow(FALSE); GetDlgItem(IDC_TIME_CHECK)->EnableWindow(FALSE); m_DateEdit.EnableWindow(FALSE); m_TimeEdit.EnableWindow(FALSE);}

63(5)為ShowAgain按鈕添加代碼voidCMy13_8Dlg::OnShowButton(){

GetDlgItem(IDC_DATE_CHECK)->EnableWindow(SW_SHOW); GetDlgItem(IDC_TIME_CHECK)->EnableWindow(SW_SHOW); GetDlgItem(IDC_DATE_EDIT)->EnableWindow(SW_SHOW); m_DateEdit.ShowWindow(SW_SHOW); GetDlgItem(IDC_TIME_EDIT)->EnableWindow(SW_SHOW); m_TimeEdit.ShowWindow(SW_SHOW);}

64(6)為HidetheClockSetting按鈕添加實現(xiàn)代碼voidCMy13_8Dlg::OnHideButton(){ GetDlgItem(IDC_DATE_CHECK)->EnableWindow(SW_HIDE); GetDlgItem(IDC_TIME_CHECK)->EnableWindow(SW_HIDE); m_DateEdit.ShowWindow(SW_HIDE); m_TimeEdit.ShowWindow(SW_HIDE);}

65(7)

給Show_the_Sex_and_Age按鈕添加代碼voidCMy13_8Dlg::OnShowSexAgeBUTTON(){ charsEdit[50]; intiSexRADIO; intiAgeRADIO; iSexRADIO=GetCheckedRadioButton(IDC_Boy_RADIO,IDC_Girl_RADIO);

if(iSexRADIO==IDC_Boy_RADIO) strcpy(sEdit,"Theboy'sageis"); if(iSexRADIO==IDC_Girl_RADIO) strcpy(sEdit,"Thegirl'sageis"); iAgeRADIO=GetCheckedRadioButton(IDC_Age1_RADIO,IDC_Age3_RADIO);

if(iAgeRADIO==IDC_Age1_RADIO) strcat(sEdit,“greatthan20”);//將一個字符串連接到另一個后面 if(iAgeRADIO==IDC_Age2_RADIO) strcat(sEdit,"between15and20");

if(iAgeRADIO==IDC_Age3_RADIO) strcat(sEdit,"lessthan15"); m_ResultEdit.SetSel(0,-1);m_ResultEdit.ReplaceSel(sEdit);}

66(8)

為Show_Combo按鈕添加代碼voidCMy13_8Dlg::OnShowComboButton(){ UpdateData(TRUE); charsCourseEdit[30]; charsRecordEdit[15]; intiCourseRadio;

iCourseRadio=GetCheckedRadioButton(IDC_ENGLISH_RADIO,IDC_NATURE_RADIO); if(iCourseRadio==IDC_ENGLISH_RADIO) strcpy(sCourseEdit,"Englishrecordis"); if(iCourseRadio==IDC_COMPUTER_RADIO) strcpy(sCourseEdit,"Computerrecordis"); if(iCourseRadio==IDC_NATURE_RADIO) strcpy(sCourseEdit,"Naturalrecordis"); m_Record.GetWindowText(sRecordEdit,15);//查詢按鈕中顯示的正文 strcat(sCourseEdit,”’"); strcat(sCourseEdit,sRecordEdit); m_ComboEdit=_T(sCourseEdit); UpdateData(FALSE);}67(9)

給OnExitButton()方法添加代碼voidCMy13_8Dlg::OnExitButton(){

OnOK(); }

68初始化單選按鈕

BOOLCMy13_8Dlg::OnInitDialog(){ CDialog::OnInitDialog();…… //TODO:Addextrainitializationhere

CheckRadioButton(IDC_Boy_RADIO,IDC_Girl_RADIO,IDC_Boy_RADIO);

CheckRadioButton(IDC_Age1_RADIO,IDC_Age3_RADIO,IDC_Age2_RADIO); UpdateData(FALSE); m_English=0; m_Record.AddString("85"); m_Record.AddString("120"); m_Record.AddString("125"); m_Record.SelectString(-1,"125"); UpdateData(FALSE); returnTRUE;}6913.8對話框通用控件

大部分控件都是在對話框中使用的,無論是基于對話框的應用程序還是Doc/View結構的應用程序,控件通常是放在對話框中的。本節(jié)將以一個名為“Ctrl”的基于對話框的應用程序來介紹各種Windows通用控件的使用。7013.8.1Picture控件的使用

(1)分隔線將Picture控件拖放到對話框上,【Type】屬性選擇“Frame”,【Color】屬性選擇“Etched”,將控件拖到最細,這時,Picture控件看起來的效果就跟一條分隔線一樣了71(2)圖片將【Type】屬性設置為“Icon”或者“Bitmap”的時候,可以設置【Image】屬性為相應的資源ID,來顯示圖標或位圖。我們在資源中導入一位圖,命名為IDB_BITMAP_DOT,設置Picture控件【Type】為“Bitmap”,【Image】為“IDB_BITMAP_DOT”7213.8.2Spin控件的使用

Spin按鈕控件提供了一對箭頭,用戶通過點擊箭頭可以微調該控件所表示的數(shù)值。表示Spin控件的是CSpinButtonCtrl類Spin控件通常和taborder位于它之前的控件成對使用。通過CSpinButtonCtrl的GetBuddy方法可獲得與之配對的控件73向對話框拖放一個Edit控件,置為只讀,然后拖放一個Spin控件緊挨著剛才拖放的Edit控件,兩個控件的ID都是用默認值,設置Spin控件的【Allignment】屬性為“Right”,選中【Autobuddy】屬性BOOLCEx13_12Dlg::OnInitDialog(){ ……//TODO:AddextrainitializationhereCSpinButtonCtrl*pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);pSpin->SetRange(0,100);pSpin->SetPos(50);pSpin->GetBuddy()->SetWindowText("5.0");returnTRUE;}設置Spin的范圍是0~100,當前位置是50,同時設置它的配對控件的顯示值74在對話框中添加WM_VSCROLL消息的響應:voidCEx13_12Dlg::OnVScroll(……){if(pScrollBar->GetDlgCtrlID()==IDC_SPIN1){CStringstrValue;strValue.Format("%3.1f",(double)nPos/10.0);

((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strValue);}CDialog::OnVScroll(nSBCode,nPos,pScrollBar);}7513.8.3Progress控件的使用

進度控件是一個用來指示長時間操作的進展程度的控件。MFC中表示進度控制的是CProgressCtrl類

進度條有一個范圍和當前位置。范圍表示整個操作的持續(xù)時間,當前位置表示當前進行到的位置,進度條根據當前位置來判斷進行的百分比,來顯示進度76添加一個Progress控件,保持默認ID,設置Smooth屬性。在旁邊添加一個按鈕,設置ID為“IDC_BUTTON_START”,Caption為“開始”

在OnInitDialog中添加如下代碼:CProgressCtrl*pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetRange(0,100);pProg->SetPos(50);為“開始”按鈕添加點擊事件實現(xiàn)代碼:voidCEx13_12Dlg::OnButtonStar(){CProgressCtrl*pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetPos(0);SetTimer(1000,100,NULL);}77在CCtrlDlg中添加對WM_TIMER消息的響應函數(shù):voidCEx13_12Dlg::OnTimer(UINTnIDEvent){ if(nIDEvent==1000) { CProgressCtrl*pProg=(CProgressCtrl*) GetDlgItem(IDC_PROGRESS1); pProg->SetPos(pProg->GetPos()+1); if(pProg->GetPos()>=100) { KillTimer(nIDEvent); AfxMessageBox("進行完畢"); } } CDialog::OnTimer(nIDEvent);}每隔0.1秒,進度條前進一步

7813.8.4Slider控件的使用

滑塊控件可以使用戶通過拖動滑塊來快速獲得指定的數(shù)據。當用戶滑動滑塊的時候,控件將發(fā)送消息來指示變化。 滑塊控件在你選擇一系列離散值或者一段連續(xù)范圍內的時候十分有用。79在對話框上增加一個Slider控件,設置Point屬性為“Bottom/Right”,然后在旁邊添加一個Static控件,ID設置為IDC_STATIC_SLIDER。該控件用來顯示滑塊的當前位置。在OnInitDialog函數(shù)中添加如下代碼:CStringstrText1;CSliderCtrl*pSlide1= (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);pSlide1->SetRange(0,100);pSlide1->SetPos(50);strText1.Format("%d",pSlide1->GetPos());SetDlgItemText(IDC_STATIC_SLIDER,strText1);

80

為了響應滑塊移動的消息,添加WM_HSCROLL消息的響應(Slider是水平的,如果是垂直的,則需要響應WM_VSCROLL)。實現(xiàn)如下:voidCEx13_12Dlg::OnHScroll(……){

if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER1) { CSliderCtrl*pSlide=(CSliderCtrl*)pScrollBar; CStringstrText; strText.Format("%d",pSlide->GetPos()); SetDlgItemText(IDC_STATIC_SLIDER,strText); } CDialog::OnHScroll(nSBCode,nPos,pScrollBar);}8113.8.5DateTimePicker控件的使用

DateTimerPicker可以用來接收日期或者時間輸入。用戶可以直接按照指定的形式輸入,也可以在彈出的日歷控件中選擇日期。如果讓用戶以字符串形式輸入,則由于輸入的多樣性,程序不好解析82在對話框上添加一個DateTimePicker控件,設置Format為“ShortDate”,選擇“UseSpinControl”,如果不選擇使用Spin控件,則用戶在彈出的日歷控件中進行輸入。在該控件旁邊添加一個按鈕,ID為“IDC_BUTTON_TIME”,Caption為“報時”。在OnInitDialog中添加如下代碼:CDateTimeCtrl*pDT= (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);CStringformatStr=_T("'今天是:'yy'/'MM'/'dd");pDT->SetFormat(formatStr);83添加對【報時】按鈕的點擊事件的響應函數(shù):voidCEx13_12Dlg::OnButtonTime(){ CDateTimeCtrl*pDT=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);

CTimet; pDT->GetTime(t);

CStrings=t.Format("%A,%B%d,%Y%H:%M:%S"); AfxMessageBox(s);}

8413.8.6ListControl控件的使用列表控件85列表控件是Windows應用程序中最常用的控件之一。最常見的用途就是資源管理器右邊的文件列表。MFC中使用CListCtrl類來封裝列表控件的功能。列表控件通常可以包括一個圖標和一個標簽。此外,每一項還可以具有其它附加信息,例如資源管理器中文件的具體信息就是附加信息。86列表控件的視圖風格圖標視圖:每項顯示32×32圖標,在圖標下面顯示標簽。用戶可以將圖標拖放到視圖內任何位置

小圖標視圖:每項顯示16×16圖標,在圖標右邊顯示標簽。用戶可以將圖標拖放到視圖內任何位置

列表視圖:每項顯示16×16圖標,在圖標右邊顯示標簽。每一項按列排列,不能隨意拖動圖標

報表視圖:每項占一行,第一列是主項,顯示16×16圖標,在圖標右側顯示標簽。右邊的列顯示子項,具體由程序來決定

87為使用列表控件,首先需要創(chuàng)建圖標資源,在ResourceView的Icon一欄內創(chuàng)建8個圖標資源

在Cex13_12Dlg類中增加成員如下:CImageListm_imageList;在OnInitDialog函數(shù)中添加初始化圖片列表的代碼:HICONhIcon[8]; intn;m_imageList.Create(16,16,0,8,8);hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_WHITE);hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BLACK);hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_RED);hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BLUE);hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_YELLOW);hIcon[5]=AfxGetApp()->LoadIcon(IDI_ICON_CYAN);hIcon[6]=AfxGetApp()->LoadIcon(IDI_ICON_PURPLE);hIcon[7]=AfxGetApp()->LoadIcon(IDI_ICON_GREEN);for(n=0;n<8;n++)m_imageList.Add(hIcon[n]);88創(chuàng)建標簽資源,也就是每一項的文字,在OnInitDialog函數(shù)中添加如下實現(xiàn)代碼:staticchar*color[]={"white","black","red","blue","yellow","cyan","purple","green"}; 有了這些資源,就可以創(chuàng)建列表控件了。

在對話框上添加一個ListControl,其ID為IDC_LIST1,在樣式中選擇視圖風格為List,并選擇Editlables選項。視圖風格為列表風格,也就是圖標按列排列。設置【Editlables】屬性,允許用于可編輯標簽。

89為了創(chuàng)建控件,首先在OnInitDialog中添加如下代碼:

CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1); //獲得控件對象

pList->SetImageList(&m_imageList,LVSIL_SMALL); //設置小圖標圖片列表

for(n=0;n<8;n++){//第一個參數(shù)為項id,第二個為標簽文字,第三個為對應圖片列表id pList->InsertItem(n,color[n],n); } pList->SetBkColor(RGB(0,255,255));//設置背景色 pList->SetTextBkColor(RGB(255,0,255)); //設置文字的背景色

現(xiàn)在編譯運行已經可以看到列表的運行效果了。90在列表控件下添加static控件,ID為IDC_STATIC_LIST。對列表控件添加對LVN_ITEMCHANGED消息的響應:voidCEx13_12Dlg::OnItemchangedList1(……){ NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; //TODO:Addyourcontrolnotificationhandlercodehere

CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1); intnSelected=pNMListView->iItem; if(nSelected>=0) { CStringstrItem=pList->GetItemText(nSelected,0); SetDlgItemText(IDC_STATIC_LIST,strItem); } *pResult=0;}91在設置控件屬性時,設置了Editlabels屬性,下面是對列表控件的NM_RCLICK消息的響應:voidCEx13_12Dlg::OnRclickList1(……){ //TODO:Addyourcontrolnotificationhandlercodehere

NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1); intnSelected=pNMListView->iItem; if(nSelected>=0) pList->EditLabel(nSelected); *pResult=0;}92

運行程序,右擊某一項,已可以編輯標簽了,但無法保存編輯效果。若要保存,需要響應列表控件的LVN_ENDLABELEDIT消息,在這里可以判斷新輸入的文字是否合法,然后設置標簽為編輯得到的文字:voidCEx13_12Dlg::OnEndlabeleditList1(……){

LV_DISPINFO*pDispInfo=(LV_DISPINFO*)pNMHDR; //TODO:Addyourcontrolnotificationhandlercodehere LVITEMAitem=pDispInfo->item; CStringstr=item.pszText; str.TrimLeft(); str.TrimRight(); if(str.GetLength()>0) {CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1); pList->SetItemText(item.iItem,item.iSubItem,item.pszText); } *pResult=0;}9313.8.7TreeControl控件的使用

樹狀視圖控件是一種用來顯示層次結構的控件,例如Windows資源管理器左邊的視圖。視圖中的每一項包括一個標簽,位圖是可選的,每項還可以附加若干子項。點擊每一項,可展開或合攏當前樹節(jié)點94本例中繼續(xù)使用ListControl中的圖標。接下來在對話框中添加樹狀控件,其ID為IDC_TREE1,選中Hasbuttons、Haslines、Linesatroot和Editlabels屬性Hasbuttons:決定可展開項之前是否有“+”、“-”按鈕HasLines:決定相關節(jié)點之間是否顯示虛線連接Linesatroot:決定位于第一層的節(jié)點之間是否有虛線連接Editlabels:表示標簽是否可編輯

95然后在OnInitDialog函數(shù)中添加如下代碼:CTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1); pTree->SetImageList(&m_imageList,TVSIL_NORMAL);//設置圖片列表TV_INSERTSTRUCTtvinsert; //創(chuàng)建待插入的TV_INSERTSTRUCT結構tvinsert.hParent=NULL; //無父結點tvinsert.hInsertAfter=TVI_LAST; //插入到本層最后tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;

//掩碼:圖標/選中圖標/文字tvinsert.item.hItem=NULL; //句柄為空tvinsert.item.state=0; //狀態(tài)tvinsert.item.stateMask=0; //狀態(tài)掩碼,不使用這兩項tvinsert.item.cchTextMax=6; //最大文字長度,忽略tvinsert.item.iSelectedImage=1; //選中圖標索引tvinsert.item.cChildren=0; //沒有子節(jié)點tvinsert.item.lParam=0; //自定義數(shù)據96//創(chuàng)建第一層tvinsert.item.iImage=2; //一般圖標tvinsert.item.pszText="father"; //插入第一層第一個節(jié)點HTREEITEMhDad=pTree->InsertItem(&tvinsert);tvinsert.item.pszText="mother"; //插入第一層第二個節(jié)點HTREEITEMhMom=pTree->InsertItem(&tvinsert);//創(chuàng)建第二層tvinsert.hParent=hDad; //父節(jié)點為"father"tvinsert.item.iImage=3; //一般圖標tvinsert.item.pszText="son"; //插入第二層"father"的第一個節(jié)點pTree->InsertItem(&tvinsert);tvinsert.item.pszText="daughter"; //插入第二層的第二個節(jié)點pTree->InsertItem(&tvinsert);tvinsert.hParent=hMom; //父結點為"mother"tvinsert.item.iImage=4;97tvinsert.item.pszText=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論