用VC++實(shí)現(xiàn)自繪按鈕控制_第1頁
用VC++實(shí)現(xiàn)自繪按鈕控制_第2頁
用VC++實(shí)現(xiàn)自繪按鈕控制_第3頁
用VC++實(shí)現(xiàn)自繪按鈕控制_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

用VC++實(shí)現(xiàn)自繪按鈕控制MicrosoftWindows以其豐富一致的圖形用戶界面,簡單靈便的操作,被廣大用戶所接受。對(duì)話框就是其中一個(gè)非常重要的界面形式,并且Windows為其應(yīng)用程序的開發(fā)者提供了相當(dāng)豐富的界面資源,許多控制可以方便地加入對(duì)話框中。但當(dāng)我們需要編寫一個(gè)商業(yè)應(yīng)用,需要一個(gè)更友好的圖形用戶界面時(shí),就會(huì)發(fā)現(xiàn)資源的貧乏。VisualC++提供了一個(gè)CBitmapButton類在一定程序上緩解了增加新資源的要求。但當(dāng)我們要求在程序中能動(dòng)態(tài)地改變圖形時(shí),我們就不得不考慮放棄CBitmapButton類,而坐下來自己做一點(diǎn)工作了。一個(gè)可行的辦法就是重載CButton類(即按鈕控制)。這樣對(duì)這塊區(qū)域的大小、位置和ID號(hào)都可以通過AppStadio方便地制作。當(dāng)然這樣作最大的好處還是在于充分利用C++的特性把繪制控制的代碼封裝了起來,既避免了重復(fù)性開發(fā),又使程序變得更簡潔,增強(qiáng)了代碼的可讀性?,F(xiàn)在我們就通過創(chuàng)建一個(gè)名叫CColorButton的類來學(xué)習(xí)這種方法。雖然這是一個(gè)功能非常簡單的類,通過調(diào)用成員函數(shù)ChangeColor可改變其顏色,鼠標(biāo)點(diǎn)中時(shí)則高亮邊框表示選中。但利用這種思路我們只需添加幾個(gè)數(shù)據(jù)成員和重載一個(gè)函數(shù)就可以方便地實(shí)現(xiàn)你所需要的功能。在創(chuàng)建這個(gè)類之前,我們必須先了解WM_DRAWITEM消息。當(dāng)按鈕、組合框、列表框或菜單的某一視覺狀況發(fā)生變化時(shí),系統(tǒng)就會(huì)發(fā)送一條WM_DRAWITEM消息給這些控制的擁有者窗口。這個(gè)消息的wParam指出這個(gè)控制的id號(hào),而IParam則是一個(gè)指向DRAWITEMSTRUCT結(jié)構(gòu)的指針,該結(jié)構(gòu)存放有關(guān)要繪制的項(xiàng)的信息以及繪制所需的類型。DRAWITEMSTRUCT結(jié)構(gòu)具有如下格式。typedefstructtagDRAWITEMSTRUCT{UINTCtlType;//控制類型UINTCtlID;//控制的ID號(hào)UNITitemID;//菜單項(xiàng)的索引UINTitemAction;//說明需要的繪圖操作UINTitemState;//指明繪圖后的可見狀態(tài)HWNDhwndItem;//控制的窗口句柄HDChDC;//相關(guān)的設(shè)備環(huán)境RECTrcItem;//被畫控制的邊框DWORDitemData;//指定與菜單項(xiàng)相聯(lián)系的應(yīng)用程序定義的32位值}DRAWITEMSTRUCT;其中itemAction和itemState決定了需要的繪圖操作。itemAction說明需要的繪圖操作,可為下列值中的一個(gè)或多個(gè);值含義ODA_DRAWENTIRE需要重來全部控制時(shí)ODA_FOCUS獲得或失去輸入焦點(diǎn)ODA_SELECT選擇狀態(tài)改變itemState指明當(dāng)前繪圖動(dòng)作發(fā)生之后,項(xiàng)的可見狀態(tài)。下面是狀態(tài)標(biāo)志:值含義ODS_CHECKD只用于菜單中ODS_DISABLE該項(xiàng)被屏蔽ODS_FOCUS該項(xiàng)具有輸入焦點(diǎn)ODS_GRAYED只用于菜單中ODS_SELECT該項(xiàng)處于被選中狀態(tài)利用VC++編程會(huì)發(fā)現(xiàn),當(dāng)按鈕控制接收到WM_DRMAWITEM消息時(shí)會(huì)調(diào)用Cbotton類的Drawitem函數(shù)。因此我們要做的就是利用C++的多態(tài)性通過重載CButton類的Drawitem函數(shù)來響應(yīng)MW—DRAWITEM消息。下面我們就實(shí)際構(gòu)造一個(gè)CColorButton類。classccolorButton:publicCButton{private:COLORREFm_color:public:CColorButton():CButton(),m_color(0){};〃構(gòu)造函數(shù)voidChangeColor(COLORREFcolor);〃改變顏色virtualvoidDrawitem(LPDRAWITEMSTRUCTlpDrawitemStruct)〃重載的函數(shù)};〃重載的虛函數(shù)voidCColorButton::Drawitem(LPDRAWITEMSTRUCTlpDrawitemtruct){CDCdc;dc.Attach(lpDrawitemStruct->hDC);//得到繪制的設(shè)備環(huán)境CDCVERIFY(lpDrawitemStruct->CtlType==ODT_BUTTON);if(lpDrawitemStruct->itemAction&ODA_DRAWENTIRE){//重繪整個(gè)控制CBrushbrush(color);dc.FillRect(&(lpDrawitemStruct->rcitem),&brush);}if((lpDrawitemStruct->itemState&ODS_SELECTED)&&(lpDrawitemStruct->itemAction&(ODA_SELECTIODA_DRAWENTIRE))){〃選中了本控制===>高亮邊框COLORREFfc=RGB(255,0,255);CBrushbrush(fc);dc.FrameRect(&(lpDrawitemStruct->rcitem),&brush);}if(!(lpDrawitemStruct->itemState&ODS_SELECTED)&&(lpDrawitemStruct->itemAction&ODA_SELECT)){//控制的選中狀態(tài)結(jié)束===>去掉邊框CBrushbrush(color);dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);}dc.Detach();}//用于改變顏色的成員函數(shù)voidCColorButton::ChangeColor(COLORREFcolor){CRectrect;m_color=color;GetClientRect(&rect);}m_colorChangeColor(COLORREFcolor)color,WM_DRAWITEM上面代碼中數(shù)據(jù)成員m_color和來保存按鈕的顏色。ChangeColor(COLORREFcolor)函數(shù)負(fù)責(zé)改變按鈕顏色值為color,然后通過使控制的客戶區(qū)無效而激發(fā)WM_DRAWITEM消息。現(xiàn)在這個(gè)按鈕控制類就算搭好了。下面我們把它加入到對(duì)話框中來試驗(yàn)一下:首先通過AppWizard創(chuàng)建一個(gè)單文檔的應(yīng)用。緊接著啟動(dòng)AppStadi。創(chuàng)建一個(gè)對(duì)話框。添加一個(gè)按鈕控制,并將其ID設(shè)置為IDC-COLORBUTTONo最后一定要記住將pushButtonProperties對(duì)話框中的OwnerDraw檢查框置上檢查標(biāo)志。3.在AppStadio內(nèi)運(yùn)行ClassWizzand來產(chǎn)生CTestDialog類。然后在CTestdialog類中加入數(shù)據(jù)成員,在CTestDialog類說明加入如下的private型數(shù)據(jù)成員:private:ccolorButtonm_ColorButton;4.現(xiàn)在剩下的問題是到底要怎樣才能使m_ColorButton的DrawItem函數(shù)能響應(yīng)系統(tǒng)發(fā)往ID值為IDC-COLORBUTTON的按鈕控制的WM_DRAWITEM消息。這時(shí)就要用到CWnd類的成員函數(shù)BOOLCWnd::SubclassDlgItem(UINTnID,CWnd*pParent)。通過調(diào)用這個(gè)函數(shù),我們可以動(dòng)態(tài)地接管從對(duì)話框模板產(chǎn)生的控制,并把它隸屬于CWnd對(duì)象。即用當(dāng)前的CWnd對(duì)象接管發(fā)向隸屬于pParent的ID號(hào)為nID的控制的一切消息。對(duì)于按鈕控制而言,它把當(dāng)前的按鈕控制的位置和大小也清成和nID對(duì)應(yīng)的按鈕控制一樣。于是我們對(duì)CTestDialog的源文件進(jìn)行如下的編輯:BOOLCTestDialog::OnInitDialog(){CDialog::OnInitDialog();//TODO:Addextrainitializationherem_ColorButton.SubclassDlgtem(IDC—COLORBUTTON,this);//接管消息m_ColorButton.ChangeColor(RGB(255,0,0);〃設(shè)置為紅色(可設(shè)為任何顏色)return(TRUE);}接著通過ClassWizzard在CTestDialog中加入一個(gè)響應(yīng)鼠標(biāo)點(diǎn)擊IDC—COLORBUTTON按鈕的消息的函數(shù):voidCTestDialog::OnColerbutton(){//TODO:Addyourcontrolnotificationhandlercodehereintr=int(((float)rand()/RAND—MAX)*255intg=int(((float)rand()/RAND—MAX)*255intb=int(((float)rand()/RAND—MAX)*255m_ColorButton.ChangeColor(RGB(r,g,b));}最后,利用ClassWizzard為View加入一個(gè)響應(yīng)WM_LBUTTONDOWN的函數(shù),以便激活對(duì)話框。請(qǐng)按如下代碼對(duì)其進(jìn)行編輯。voidCTestView::OnLButtonDown(UINTnflags,POINTpoint){CTestDialogdlg;dlg.Domodal();}編譯并測試該程序。當(dāng)鼠標(biāo)在落視窗中時(shí),按下鼠標(biāo)左鍵應(yīng)能彈出一個(gè)對(duì)話框。在對(duì)話框中的紅色矩形區(qū)域內(nèi)按下鼠標(biāo)左鍵就會(huì)使其邊框變成高亮狀態(tài),若在這塊區(qū)域內(nèi)釋放左鍵則這城區(qū)域就會(huì)改變顏色且顏色是隨機(jī)的。只需更改DrawItem函數(shù)中的重繪代碼,就可以得到自己的需要圖形按鈕。int*intArray;inti,j,k,temp;time_tt;intArray=malloc(m*sizeof(int));srand((unsigned)time(&t));/*依次產(chǎn)生m個(gè)隨機(jī)數(shù)*/for(i=0;i<m;i++)(temp=rand()%n;/*查找temp原先的“真實(shí)”編號(hào)*/for(j=0;j<i;j++)if(temp>=intArray[j])temp++;else(/*temp應(yīng)插在k位置處,這樣數(shù)組intArray就實(shí)現(xiàn)了排序,同時(shí)得到了temp原先的編號(hào)*/k=j-1;break;}for(j=i-1;j>k;j--)intArray[j+1]=intArray[j];intArray[k]=temp;①/*以下根據(jù)題號(hào)產(chǎn)生題庫部分省略*/}free(intArray);load圖形voidCOnlineMonitorView::OnDraw(CDC*pDC){COnlineMonitorDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddr

溫馨提示

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

評(píng)論

0/150

提交評(píng)論