MFC自繪Button按鈕分析和實現

2022-09-27 09:54:18 字數 2981 閱讀 7033

對於按壓式的button按鈕,wm_ctlcolor無法完成按鈕控制項的背景顏色和字型顏色修改,若想要完成外觀定製需要新增wm_drawitem訊息或者重寫cbutton類中的drawitem函式完成按鈕外觀修改,下面逐一介紹。

自繪製知識基礎

自繪製需要的兩個基礎步驟:

1.控制項型別設定為 bs_ownerdraw

2.新增wm_d訊息響應函式或者重寫drawitem函式。

wm_drawitem訊息響應原型如下:

afx_msg void ondrawitem( int nidctl, lpdrawitemstruct lpdrawitemstruct );

引數:nidctl

包含了傳送wm_drawitem訊息的控制項的識別符號。如果選單傳送了此訊息,則nidctl中包含0。

lpdrawitemstruct

指定了指向drawitemstruct資料結構的長指標,其中包含有關要畫出的項和要求的繪圖型別的資訊。

說明:當控制項或選單的可視狀態發生變化時,框架為自畫按鈕控制項、組合框控制項、列表框控制項或者選單的擁有者呼叫這個成員函式。

drawitemstruct結構體資訊如下:

typedef struct tagdrawitemstruct

drawitemstruct;

drawitem函式原型如下,入參和ondrawitem一樣,不再重複介紹:

virtual void drawitem(lpdrawitemstruct /*lpdrawitemstruct*/);

需要說明的是,若某個控制項擁有了bs_ownerdraw屬性,則控制項的繪製將由父視窗完成轉移給了「程式設計師」,程式設計師需要完成所有的繪製工作,也就實現了控制項自繪,若沒有完成控制項繪製功作,我們在介面上將看不到對應的控制項,我們在重繪某個控制項時,強烈推薦使用子類化方法,比如www.cppcns.com想自繪button控制項, 首先新增自己的類cmybutton 繼承自 cbutton,這樣的設計符合程式設計思想,避免了父類功能的臃腫,也實現了程式的復用。

自繪製原理分析

自繪基本流程我已經繪製成流程圖了,這樣也清晰易懂,圖中的數字標識也給出了簡單介紹程式設計客棧,自繪流程如圖1所示:

圖1 自繪製原理

1.子控制項將要被繪製時,檢測該控制項有bs_ownerdraw屬性,則向父視窗傳送wm_drawitem訊息

2.父視窗完成收集和準備控制項繪製所必要的資訊

3.若reflectlastmsg函式返回true,表示訊息反射成功,使用子控制項中的繪製**

4.若reflectlastmsg函式返回false,表示訊息反射失敗,使用父視窗中的繪製**

5.訊息反射成功了,我們就可以重寫cbutton中drawitem虛函式完成控制項自繪製

下面將展示如何完成控制項的繪製步驟:

1.基於對話方塊建立drawbutton工程

2.添三個按壓式button控制項,其id分別四idc_yes,idc_no, idc_help如圖2所示:

圖2  控制項布局

3.分別在父視窗(對話方塊)和子類化中實現自繪,具體過程如下:

父視窗中實現自繪製

具體過程:類檢視->屬性->查詢wm_wm_drawitem->新增並編輯"ondrawitem",其**如下:

void cdr nidctl, lpdrawitemstruct lpdrawitemstruct)

子類化實現自繪製

具體過程:

1.類檢視->點選工程名->點選新增->mfc類->基類:cbutton,子類命名為cmybutton。

2.資源檢視->控制項idc_yes,idc_help新增變數->型別選擇為cmybutton。

在自定義的cmybutton中我們新增drawitem虛函式,其具體**如下:

void cmybutton::drawitem(lpdrawitemstruct lpdrawitemstruct)

cdc* pdc = cdc::fromhandle(lpdrawitemstruct->hdc);

crect drawrect;

//獲得繪圖dc

//得到原button的矩形大小

drawrect.copyrect(&(lpdrawitemstruct->rcitem));

//繪製控制項框架

pdc->drawframecontrol(&drawrect,dfc_button,lpdrawitemstruct->ctltype);

//使得初始的button顏色不一樣

static程式設計客棧 int nstepcolor = 0;

//建立畫刷

cbrush pbrush;

pbrush.createsolidbrush(rgb(100+nstepcolor,130,nstepcolor));

//畫矩形

pdc->fillrect(drawrect,&pbrush);

//定義乙個crect用於繪製文字

crect textrect;

//拷貝矩形區域

textrect.copyrect(&drawrect);

//獲得字串尺寸

csize sz = pdc->gettextextent(btncaption);

//調整文字位置 居中

textrect.top += (textrect.height()- sz.cy)/2;

//設定文字背景透明

pdc->setbkmode(transparent);

//設定文字顏色

pdc->settextcolor(rgb(0,0,255));

//繪製文字內容

pdc->drawtext(btncaption,&textrect,dt_right|dt_center|dt_bottom);

nstepcolor += 120;

}執行效果:

說明中間乙個button按鈕的自繪是由父視窗的ondrawitem實現的。

本文標題: mfc自繪button按鈕分析和實現

本文位址:

wtl自繪,按鈕Button

件 pragma once class cmybuttonex public cwindowimpl,public cownerdraw begin msg map cmybuttonex chain msg map alt cownerdraw,1 default reflection handl...

MFC自繪按鈕

1.建立乙個基於對話方塊的程式 2.在這裡,我是將 確定 按鈕重繪,拉大 確定 按鈕 如下 修改為自繪 3.新增位 件id為iidb bitmap1 4.新增類cmybutton基類為cbutton 後面兩個函式是我自己新增的,其中drawitem函式在基類中為虛函式,我們在派生類中過載,負責按鈕的...

MFC自繪按鈕的實現

自繪按鈕的實現過程 首先在vc6中新建工程,選擇mfc並且新建dialog工程 在dlg類的物件上新增wm drawitem屬性 新增繪圖函式 void cmy40 mybuttondlg ondrawitem int nidctl,lpdrawitemstruct lpdrawitemstruct...