版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第13章
Windows標(biāo)準(zhǔn)控件在可視化編程中的應(yīng)用1控件是Windows圖形用戶界面的主要組成部分之一,用戶通過操作控件對(duì)象完成與應(yīng)用程序之間的交互??丶氖褂眉畜w現(xiàn)了Windows系統(tǒng)面向?qū)ο蟮奶攸c(diǎn)213.1概述控件工具欄控件接受的消息主要有單擊、雙擊和字符輸入等313.2按鈕控件及其應(yīng)用按鈕控件普通按鈕圓按鈕復(fù)選框按鈕組框按鈕自繪按鈕
413.2.1按鈕控件的創(chuàng)建過程
CButton類的成員函數(shù)Create負(fù)責(zé)創(chuàng)建按鈕控件,該函數(shù)的聲明為:
BOOLCreate(LPCTSTRlpszCaption,//指定了按鈕顯示的正文
DWORDdwStyle, //按鈕的風(fēng)格
constRECT&rect, //按鈕的位置和大小
CWnd*pParentWnd, //指向父窗口,UINTnID //按鈕的ID
)5按鈕控件消息:ON_BN_CLICKEDON_BN_DBLCLICKEDON_COMMAND兩個(gè)類似按鈕是最常見的控件之一復(fù)選框單選按鈕下壓式按鈕分組框常用于顯示一組選項(xiàng)供用戶選擇適用于同一組屬性相同的數(shù)據(jù)中選一個(gè)數(shù)據(jù)適用于消息的發(fā)送沒有太多的操作只是在窗口中劃分區(qū)域范圍6GetCheck()SetCheck()GetBitmap()SetBitmap()GetButtonStyle()SetButtonStyle()GetCursor()SetCursor()GetIcon()SetIcon()GetState()SetState()CButton類的成員函數(shù)在知道按鈕ID的前提下,還可使用與按鈕有關(guān)的CWnd成員函數(shù)來設(shè)置或查詢按鈕狀態(tài)CheckDlgButtonCheckRadioButtonGetCheckedRadioButtonIsDlgButtonCheckedGetWindowTexGetWindowTextLengthSetWindowText7MFC還提供了一個(gè)CBitmapButton的類,允許用戶以圖標(biāo)的方式顯示按鈕,它是在CButton下派生的
MFC調(diào)用方法DrawItem()在按鈕上繪制位圖,LoadBitmaps()方法為一個(gè)CBitmapButton對(duì)象附上位圖,最多可以有4個(gè)位圖自定義按鈕813.2.2按鈕控件示例
9Group屬性Auto屬性主要步驟:創(chuàng)建基于對(duì)話框項(xiàng)目設(shè)置按鈕的屬性103.添加成員變量并添加消息響應(yīng)函數(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滾動(dòng)條控件
滾動(dòng)條是一個(gè)交互式的、高度可視化的控件它包括一個(gè)滑塊、滾動(dòng)條的兩端的按鈕等。滾動(dòng)條控件與屬于窗口的滾動(dòng)條是不一樣的處于窗口的滾動(dòng)條是由該窗口創(chuàng)建、管理和釋放的滾動(dòng)條控件是由用戶創(chuàng)建、管理和釋放的1313.3.1滾動(dòng)條類的結(jié)構(gòu)及其方法
滾動(dòng)條可以通過通知代碼來創(chuàng)建,也可以用對(duì)話框資源模板來創(chuàng)建1413.3.2創(chuàng)建與初始化滾動(dòng)條類
創(chuàng)建CScrollBar對(duì)象的一般步驟(1)用C++關(guān)鍵字new和構(gòu)造函數(shù)CScrollBar::CScrollBar()為一個(gè)ScrollBar對(duì)象分配一個(gè)實(shí)例(2)初始化CScrollBar對(duì)象,將一個(gè)Windows滾動(dòng)條賦予它,并用CScroll::Create()方法設(shè)置參數(shù)和樣式分配一個(gè)滾動(dòng)條控件對(duì)象并返回指向該對(duì)象的指針CScrollBar::pMyScroll=newCScrollBar調(diào)用CScrollBar::Create()方法初始化指針BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);滾動(dòng)條窗口的樣式表示控件的大小和位置指向控件所屬窗口的指針父窗口與滾動(dòng)條通信的標(biāo)識(shí)15在設(shè)置滾動(dòng)條控件時(shí),要通過如下方法設(shè)置其范圍CScrollBar::SetScrollRange()例如,設(shè)置滾動(dòng)范圍為-100到100的垂直滾動(dòng)條pMyScroll->SetScrollRange(SB_VERT,-100,100);通過SetScrollPos()設(shè)置滾動(dòng)塊當(dāng)前位置例如,滾動(dòng)塊的位置在-100到100的中間,即為0的位置pMyScroller->SetScrollPos(0);1613.3.3滾動(dòng)條類編程實(shí)例
標(biāo)題為ApplicationofScrollBar滾動(dòng)條的滾動(dòng)范圍設(shè)為0到20單擊滾動(dòng)塊與箭頭之間的區(qū)域。滾動(dòng)塊上移或下移三格,編輯框中的數(shù)字加3或減3單擊向上或向下的箭頭,滾動(dòng)塊向上或向下移動(dòng)一格,編輯框中的數(shù)字加1或減1按住滾動(dòng)塊上下拖動(dòng)。編輯框中的數(shù)字隨著隨之變化當(dāng)前值為10單擊Up按鈕,滾動(dòng)塊移到最上邊,編輯框的數(shù)字變?yōu)?單擊Down按鈕,滾動(dòng)塊移到最下邊,編輯框的數(shù)字變?yōu)?0單擊Reset按鈕,滑塊移到中間,編輯框的數(shù)字變?yōu)?0單擊Exit按鈕,退出應(yīng)用程序17(1)應(yīng)用程序的可視化編程部分18(2)應(yīng)用程序的代碼編程部分(a)給滾動(dòng)條連接變量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ù)轉(zhuǎn)為字符串 itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); UpdateData(FALSE); returnTRUE;}10進(jìn)制數(shù)(b)初始化滾動(dòng)條20(3)給滾動(dòng)條消息添加代碼voidCMy13_2Dlg::OnVScroll(……){ charsPos[10]; intiNowPos; switch(nSBCode) {if(pScrollBar==&m_Scrollbar) { caseSB_THUMBTRACK: //拖動(dòng)滑塊 m_Scrollbar.SetScrollPos(nPos); itoa(nPos,sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos);21caseSB_LINEDOWN: //單擊滾動(dòng)條向下的箭頭 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: //單擊滾動(dòng)條向上的箭頭 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在應(yīng)用程序中,編輯框只是有于顯示滾動(dòng)塊的位置,不需要進(jìn)行編輯,因此必須將其屬性改為只讀2813.4編輯框控件
編輯框控件看起來是個(gè)非常簡單的矩形窗口,但它具有許多功能,編輯框控件可以自帶滾動(dòng)條,顯示多行文本。CEdit是CWnd類直接派生來的,這就意味著它具有CWnd的所有功能
編輯框控件單行編輯框控件多行編輯框控件2913.4.1編輯框類常用方法303113.4.2編輯框與應(yīng)用程序間的消息傳遞
編輯框通過向其父窗口發(fā)送WM_COMMAND消息通知應(yīng)用程序用戶的交互信息
應(yīng)用程序?qū)庉嬁虻牟僮魍ㄟ^調(diào)用函數(shù)SendMessage或SendDlgItemMessage
3213.4.3編輯類編程實(shí)例
單擊Showl,則在Edit1編輯框中顯示“ThisisthefirstEditBox.”單擊Clear1,則Edit1編輯框中的內(nèi)容被清除;單擊Show2,則在Edit2編輯框中顯示“ThisisthesecondEditBox!”單擊Clear2,則Edit2編輯框中的內(nèi)容被清除;單擊Transfer,則把Edit1編輯框的內(nèi)容復(fù)制到Edit2的編輯框中去單擊Undo,則取消上一次操作若單擊Exit,則退出程序的運(yùn)行33具體的編程過程生成了工程文件和工程工作區(qū)文件后在EditBox的工作區(qū)中選擇ResourceView因?yàn)楸緫?yīng)用程序是基于對(duì)話框的,由向?qū)蓪?duì)話框窗口作為應(yīng)用程序的主窗口,并且給這個(gè)對(duì)話框取名為IDD_EDITBOX_DIALOG,然后在這個(gè)對(duì)話框窗口中進(jìn)行界面設(shè)計(jì)34(1)創(chuàng)建資源:在ResourceView選項(xiàng)卡中打開Dialog資源組,然后雙擊IDD_EDITBOX_DIALOG。VC在工作臺(tái)中顯示可以進(jìn)行可視化編輯的IDD_EDITBOX_DIALOG對(duì)話框把鼠標(biāo)停在編輯框控件上,即可顯示該控件的類型控件工具窗提供了VC中所有可建立的控件類型35(2)設(shè)置控件ID將鼠標(biāo)移到Edit1控鍵上-->單擊鼠標(biāo)右鍵,選擇Properties命令,在窗口中輸入控件的ID標(biāo)識(shí)值,IDC_EDIT1,用同樣的方法設(shè)置其它各個(gè)對(duì)象的屬性36(3)應(yīng)用程序的代碼編程部分(a)給編輯框連接變量37(b)設(shè)置成員變量名為m_Edit1,類別為Control,變量類型為CEdit注意,不要將m_Edit1設(shè)為CString類型,因?yàn)橹挥性O(shè)為CEdit類型,才能夠調(diào)用CEdit類中的一些成員函數(shù),如Copy,Paste等,這樣才能完成本應(yīng)用程序中對(duì)Transfer按鈕要求復(fù)制內(nèi)容的操作的響應(yīng)38用同樣的方法給編輯框EDIT2等其它對(duì)象連接各自的變量,增加變量之后MFCClassWizard窗口將變?yōu)橄聢D所示39若此時(shí)運(yùn)行該程序,在Edit文本框中不能進(jìn)行多行輸入,只能單行輸入文本,而且按回車鍵終止應(yīng)用程序,同時(shí),文本框中也沒有水平和垂直滾動(dòng)條。下面,我們來完善應(yīng)用程序中編輯框的特性,使之能夠進(jìn)行多行文本的輸入40(c)修改編輯框的特性41(4)添加代碼voidCMy13_5Dlg::OnShow1Button(){m_Edit1.SetSel(0,-1);//選中編輯框IDC_EDIT1中的全部內(nèi)容m_Edit1.ReplaceSel("ThisisthefirstEditBox.");}
程序中SetSel()函數(shù)是CEdit類中的成員函數(shù),因?yàn)閙_Edit1是屬于CEdit類的對(duì)象,故可以調(diào)用該類所有的成員函數(shù)。ReplaceSel()函數(shù)也是CEdit類中成員函數(shù)。(a)給Showl按鈕連接代碼42(2)給Clear1按鈕連接代碼voidCMy13_5Dlg::OnClear1Button(){m_Edit1.SetSel(0,-1); //選中IDC_EDIT1中的內(nèi)容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ù)字的時(shí)候,程序可以隨時(shí)計(jì)算乘法的結(jié)果
ID Type Member Read-only NumberIDC_EDIT_MUL1 int m_A √ IDC_EDIT_MUL2 int m_B √IDC_EDIT_RESULTCStringm_Result √ √47初始化結(jié)果編輯框BOOLCMy13_6Dlg::OnInitDialog(){
CDialog::OnInitDialog(); ……
UpdateData(TRUE);
inti=m_A*m_B; m_Result.Format("%d",i);
UpdateData(FALSE); returnTRUE;}
48(2)當(dāng)編輯框中的內(nèi)容發(fā)生改變時(shí),會(huì)產(chǎn)生EN_CHANGE消息,需要為乘數(shù)與被乘數(shù)兩個(gè)編輯框響應(yīng)該消息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)響應(yīng)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)類的結(jié)構(gòu)及組合框的特點(diǎn)
組合框是兩種預(yù)定義窗口的組合形式。
在Windows編程中使用單一控件往往不能完全滿足與用戶交互的需要,最常見的組合框例子是對(duì)話框及與其相聯(lián)系的靜態(tài)文本和編輯框。5213.5.2組合框與應(yīng)用程序間消息傳遞
組合框通過向其父窗口發(fā)關(guān)WM_COMMAND消息通知應(yīng)用程序用戶的交互信息。應(yīng)用程序?qū)M合框的操作也通過使用函數(shù)SendMessage或SendDlgItemMessage向組合框發(fā)送消息進(jìn)行。由于對(duì)組合框的操作實(shí)際上是對(duì)組合框中各成員的操作。
5313.5.3組合框控件應(yīng)用舉例
【例13-7】本例創(chuàng)建組合框控件,當(dāng)單擊向下按鈕時(shí),顯示可選文件的名字。當(dāng)選中某一項(xiàng)時(shí),顯示該項(xiàng)的名稱
54將一個(gè)ComboBox控件放到對(duì)話框上。取消Sort風(fēng)格。否則插入的內(nèi)容將按照字母順序排序,而不是插入的順序排序。添加CComboBox類型的變量m_cbBOOLCMy13_7Dlg::OnInitDialog()//初始化對(duì)話框{ 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當(dāng)用戶選擇的內(nèi)容發(fā)生改變的時(shí)候,會(huì)產(chǎn)生CBN_SELCHANGE消息。為控件添加該消息的響應(yīng)函數(shù):voidCMy13_7Dlg::OnSelchangeCombo(){ CStringmsg; m_cb.GetLBText(m_cb.GetCurSel(),msg); AfxMessageBox(msg);}56【例13-8】本程序?yàn)閹追N控件的綜合應(yīng)用
57在設(shè)計(jì)的過程中,同一組單選按鈕必須一個(gè)接一個(gè)地放進(jìn)對(duì)話框中,中間不能插入其它的控件對(duì)于成組的單選按鈕,只在每組的第一個(gè)按鈕的屬性中選中Group設(shè)置在SexSelecting組中只有Boy單選按鈕選中Group屬性在AgeRange組中只有“>20”單選按鈕選中Group屬性58VisualC++按照放入對(duì)話框中的先后順序,給每個(gè)控件賦一個(gè)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在為相關(guān)控件連接變量和方法后,開始編程(1)給復(fù)選框IDC_DATE_CHECK添加代碼
OnDateCheck()方法的實(shí)現(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);}以當(dāng)前的屏幕顯示內(nèi)容更新控件的變量60(2)為復(fù)選框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是時(shí)間的小時(shí)表示法(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按鈕添加實(shí)現(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”);//將一個(gè)字符串連接到另一個(gè)后面 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對(duì)話框通用控件
大部分控件都是在對(duì)話框中使用的,無論是基于對(duì)話框的應(yīng)用程序還是Doc/View結(jié)構(gòu)的應(yīng)用程序,控件通常是放在對(duì)話框中的。本節(jié)將以一個(gè)名為“Ctrl”的基于對(duì)話框的應(yīng)用程序來介紹各種Windows通用控件的使用。7013.8.1Picture控件的使用
(1)分隔線將Picture控件拖放到對(duì)話框上,【Type】屬性選擇“Frame”,【Color】屬性選擇“Etched”,將控件拖到最細(xì),這時(shí),Picture控件看起來的效果就跟一條分隔線一樣了71(2)圖片將【Type】屬性設(shè)置為“Icon”或者“Bitmap”的時(shí)候,可以設(shè)置【Image】屬性為相應(yīng)的資源ID,來顯示圖標(biāo)或位圖。我們?cè)谫Y源中導(dǎo)入一位圖,命名為IDB_BITMAP_DOT,設(shè)置Picture控件【Type】為“Bitmap”,【Image】為“IDB_BITMAP_DOT”7213.8.2Spin控件的使用
Spin按鈕控件提供了一對(duì)箭頭,用戶通過點(diǎn)擊箭頭可以微調(diào)該控件所表示的數(shù)值。表示Spin控件的是CSpinButtonCtrl類Spin控件通常和taborder位于它之前的控件成對(duì)使用。通過CSpinButtonCtrl的GetBuddy方法可獲得與之配對(duì)的控件73向?qū)υ捒蛲戏乓粋€(gè)Edit控件,置為只讀,然后拖放一個(gè)Spin控件緊挨著剛才拖放的Edit控件,兩個(gè)控件的ID都是用默認(rèn)值,設(shè)置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;}設(shè)置Spin的范圍是0~100,當(dāng)前位置是50,同時(shí)設(shè)置它的配對(duì)控件的顯示值74在對(duì)話框中添加WM_VSCROLL消息的響應(yīng):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控件的使用
進(jìn)度控件是一個(gè)用來指示長時(shí)間操作的進(jìn)展程度的控件。MFC中表示進(jìn)度控制的是CProgressCtrl類
進(jìn)度條有一個(gè)范圍和當(dāng)前位置。范圍表示整個(gè)操作的持續(xù)時(shí)間,當(dāng)前位置表示當(dāng)前進(jìn)行到的位置,進(jìn)度條根據(jù)當(dāng)前位置來判斷進(jìn)行的百分比,來顯示進(jìn)度76添加一個(gè)Progress控件,保持默認(rèn)ID,設(shè)置Smooth屬性。在旁邊添加一個(gè)按鈕,設(shè)置ID為“IDC_BUTTON_START”,Caption為“開始”
在OnInitDialog中添加如下代碼:CProgressCtrl*pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetRange(0,100);pProg->SetPos(50);為“開始”按鈕添加點(diǎn)擊事件實(shí)現(xiàn)代碼:voidCEx13_12Dlg::OnButtonStar(){CProgressCtrl*pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetPos(0);SetTimer(1000,100,NULL);}77在CCtrlDlg中添加對(duì)WM_TIMER消息的響應(yīng)函數(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("進(jìn)行完畢"); } } CDialog::OnTimer(nIDEvent);}每隔0.1秒,進(jìn)度條前進(jìn)一步
7813.8.4Slider控件的使用
滑塊控件可以使用戶通過拖動(dòng)滑塊來快速獲得指定的數(shù)據(jù)。當(dāng)用戶滑動(dòng)滑塊的時(shí)候,控件將發(fā)送消息來指示變化。 滑塊控件在你選擇一系列離散值或者一段連續(xù)范圍內(nèi)的時(shí)候十分有用。79在對(duì)話框上增加一個(gè)Slider控件,設(shè)置Point屬性為“Bottom/Right”,然后在旁邊添加一個(gè)Static控件,ID設(shè)置為IDC_STATIC_SLIDER。該控件用來顯示滑塊的當(dāng)前位置。在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
為了響應(yīng)滑塊移動(dòng)的消息,添加WM_HSCROLL消息的響應(yīng)(Slider是水平的,如果是垂直的,則需要響應(yīng)WM_VSCROLL)。實(shí)現(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可以用來接收日期或者時(shí)間輸入。用戶可以直接按照指定的形式輸入,也可以在彈出的日歷控件中選擇日期。如果讓用戶以字符串形式輸入,則由于輸入的多樣性,程序不好解析82在對(duì)話框上添加一個(gè)DateTimePicker控件,設(shè)置Format為“ShortDate”,選擇“UseSpinControl”,如果不選擇使用Spin控件,則用戶在彈出的日歷控件中進(jìn)行輸入。在該控件旁邊添加一個(gè)按鈕,ID為“IDC_BUTTON_TIME”,Caption為“報(bào)時(shí)”。在OnInitDialog中添加如下代碼:CDateTimeCtrl*pDT= (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);CStringformatStr=_T("'今天是:'yy'/'MM'/'dd");pDT->SetFormat(formatStr);83添加對(duì)【報(bào)時(shí)】按鈕的點(diǎn)擊事件的響應(yīng)函數(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應(yīng)用程序中最常用的控件之一。最常見的用途就是資源管理器右邊的文件列表。MFC中使用CListCtrl類來封裝列表控件的功能。列表控件通??梢园ㄒ粋€(gè)圖標(biāo)和一個(gè)標(biāo)簽。此外,每一項(xiàng)還可以具有其它附加信息,例如資源管理器中文件的具體信息就是附加信息。86列表控件的視圖風(fēng)格圖標(biāo)視圖:每項(xiàng)顯示32×32圖標(biāo),在圖標(biāo)下面顯示標(biāo)簽。用戶可以將圖標(biāo)拖放到視圖內(nèi)任何位置
小圖標(biāo)視圖:每項(xiàng)顯示16×16圖標(biāo),在圖標(biāo)右邊顯示標(biāo)簽。用戶可以將圖標(biāo)拖放到視圖內(nèi)任何位置
列表視圖:每項(xiàng)顯示16×16圖標(biāo),在圖標(biāo)右邊顯示標(biāo)簽。每一項(xiàng)按列排列,不能隨意拖動(dòng)圖標(biāo)
報(bào)表視圖:每項(xiàng)占一行,第一列是主項(xiàng),顯示16×16圖標(biāo),在圖標(biāo)右側(cè)顯示標(biāo)簽。右邊的列顯示子項(xiàng),具體由程序來決定
87為使用列表控件,首先需要?jiǎng)?chuàng)建圖標(biāo)資源,在ResourceView的Icon一欄內(nèi)創(chuàng)建8個(gè)圖標(biāo)資源
在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)建標(biāo)簽資源,也就是每一項(xiàng)的文字,在OnInitDialog函數(shù)中添加如下實(shí)現(xiàn)代碼:staticchar*color[]={"white","black","red","blue","yellow","cyan","purple","green"}; 有了這些資源,就可以創(chuàng)建列表控件了。
在對(duì)話框上添加一個(gè)ListControl,其ID為IDC_LIST1,在樣式中選擇視圖風(fēng)格為List,并選擇Editlables選項(xiàng)。視圖風(fēng)格為列表風(fēng)格,也就是圖標(biāo)按列排列。設(shè)置【Editlables】屬性,允許用于可編輯標(biāo)簽。
89為了創(chuàng)建控件,首先在OnInitDialog中添加如下代碼:
CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1); //獲得控件對(duì)象
pList->SetImageList(&m_imageList,LVSIL_SMALL); //設(shè)置小圖標(biāo)圖片列表
for(n=0;n<8;n++){//第一個(gè)參數(shù)為項(xiàng)id,第二個(gè)為標(biāo)簽文字,第三個(gè)為對(duì)應(yīng)圖片列表id pList->InsertItem(n,color[n],n); } pList->SetBkColor(RGB(0,255,255));//設(shè)置背景色 pList->SetTextBkColor(RGB(255,0,255)); //設(shè)置文字的背景色
現(xiàn)在編譯運(yùn)行已經(jīng)可以看到列表的運(yùn)行效果了。90在列表控件下添加static控件,ID為IDC_STATIC_LIST。對(duì)列表控件添加對(duì)LVN_ITEMCHANGED消息的響應(yīng):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在設(shè)置控件屬性時(shí),設(shè)置了Editlabels屬性,下面是對(duì)列表控件的NM_RCLICK消息的響應(yīng):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
運(yùn)行程序,右擊某一項(xiàng),已可以編輯標(biāo)簽了,但無法保存編輯效果。若要保存,需要響應(yīng)列表控件的LVN_ENDLABELEDIT消息,在這里可以判斷新輸入的文字是否合法,然后設(shè)置標(biāo)簽為編輯得到的文字: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控件的使用
樹狀視圖控件是一種用來顯示層次結(jié)構(gòu)的控件,例如Windows資源管理器左邊的視圖。視圖中的每一項(xiàng)包括一個(gè)標(biāo)簽,位圖是可選的,每項(xiàng)還可以附加若干子項(xiàng)。點(diǎn)擊每一項(xiàng),可展開或合攏當(dāng)前樹節(jié)點(diǎn)94本例中繼續(xù)使用ListControl中的圖標(biāo)。接下來在對(duì)話框中添加樹狀控件,其ID為IDC_TREE1,選中Hasbuttons、Haslines、Linesatroot和Editlabels屬性Hasbuttons:決定可展開項(xiàng)之前是否有“+”、“-”按鈕HasLines:決定相關(guān)節(jié)點(diǎn)之間是否顯示虛線連接Linesatroot:決定位于第一層的節(jié)點(diǎn)之間是否有虛線連接Editlabels:表示標(biāo)簽是否可編輯
95然后在OnInitDialog函數(shù)中添加如下代碼:CTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1); pTree->SetImageList(&m_imageList,TVSIL_NORMAL);//設(shè)置圖片列表TV_INSERTSTRUCTtvinsert; //創(chuàng)建待插入的TV_INSERTSTRUCT結(jié)構(gòu)tvinsert.hParent=NULL; //無父結(jié)點(diǎn)tvinsert.hInsertAfter=TVI_LAST; //插入到本層最后tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
//掩碼:圖標(biāo)/選中圖標(biāo)/文字tvinsert.item.hItem=NULL; //句柄為空tvinsert.item.state=0; //狀態(tài)tvinsert.item.stateMask=0; //狀態(tài)掩碼,不使用這兩項(xiàng)tvinsert.item.cchTextMax=6; //最大文字長度,忽略tvinsert.item.iSelectedImage=1; //選中圖標(biāo)索引tvinsert.item.cChildren=0; //沒有子節(jié)點(diǎn)tvinsert.item.lParam=0; //自定義數(shù)據(jù)96//創(chuàng)建第一層tvinsert.item.iImage=2; //一般圖標(biāo)tvinsert.item.pszText="father"; //插入第一層第一個(gè)節(jié)點(diǎn)HTREEITEMhDad=pTree->InsertItem(&tvinsert);tvinsert.item.pszText="mother"; //插入第一層第二個(gè)節(jié)點(diǎn)HTREEITEMhMom=pTree->InsertItem(&tvinsert);//創(chuàng)建第二層tvinsert.hParent=hDad; //父節(jié)點(diǎn)為"father"tvinsert.item.iImage=3; //一般圖標(biāo)tvinsert.item.pszText="son"; //插入第二層"father"的第一個(gè)節(jié)點(diǎn)pTree->InsertItem(&tvinsert);tvinsert.item.pszText="daughter"; //插入第二層的第二個(gè)節(jié)點(diǎn)pTree->InsertItem(&tvinsert);tvinsert.hParent=hMom; //父結(jié)點(diǎn)為"mother"tvinsert.item.iImage=4;97tvinsert.item.pszText=
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文明傳播責(zé)任狀
- 國防生教育培養(yǎng)協(xié)議模板
- 工程審計(jì)分包合同版
- 水泥磚供應(yīng)合同格式
- 婚禮攝影攝像服務(wù)合同
- 家電零售分銷合同
- 專業(yè)家政服務(wù)小時(shí)工合同
- 農(nóng)村養(yǎng)雞設(shè)備采購合同
- 軟件合作開發(fā)合同
- 混凝土構(gòu)件訂購合同
- 北師版七年級(jí)數(shù)學(xué)上冊(cè)期末復(fù)習(xí)考點(diǎn) 清單04 基本平面圖形(12個(gè)考點(diǎn)梳理+題型解讀+提升訓(xùn)練)
- Pep小學(xué)英語六年級(jí)上冊(cè)教案-全冊(cè)
- 2024粵東西粵北地區(qū)教師全員輪訓(xùn)培訓(xùn)心得總結(jié)
- 服務(wù)類驗(yàn)收單
- MOOC 健身健美-北京林業(yè)大學(xué) 中國大學(xué)慕課答案
- 人生悟理-透過物理看人生智慧樹知到期末考試答案2024年
- 教育信息化2.0時(shí)代教師新技能進(jìn)階智慧樹知到期末考試答案2024年
- 國開2023年春《理工英語3》機(jī)考網(wǎng)考期末復(fù)習(xí)資料參考答案
- 中國古建筑行業(yè)分析報(bào)告
- 蜂產(chǎn)品訂購合同范本
- 建筑工程雜填土基坑邊坡支護(hù)方案及效果評(píng)價(jià)分析
評(píng)論
0/150
提交評(píng)論