按鈕控制元件怎麼自繪?

MFC的按鈕的自繪,通過控制元件自繪DrawItem訊息在父視窗類中繪製子視窗。通過控制元件自繪,我們可以更多的控制。

控制元件自繪的方式有兩種:1.直接在父視窗進行自繪(本文所講述的)2.將控制元件的自繪封裝成一個類,控制元件類中自己繪製(本文不講,參考其他文章)

工具/原料

MFC

方法/步驟

實現過程:

1.在主視窗中放置一個按鈕

2.設定按鈕的行為為:Owner Draw (控制元件自繪)設定此行為後,控制元件需要自己繪製,否則顯示不了控制元件。預設沒有設定,系統會繪製此控制元件。如圖:

按鈕控制元件怎麼自繪

3.對父視窗的WM_DRAWITEM訊息進行處理在父視窗資源對話方塊中,右擊,檢視屬性,如下圖:

找到WM_DRAWITEM,新增處理函式。如圖:

新增訊息處理後,如下圖:

按鈕控制元件怎麼自繪

按鈕控制元件怎麼自繪

按鈕控制元件怎麼自繪

4.訊息處理函式OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)第一個引數int nIDCtl是控制元件ID,可以通過IF語句對ID進行判斷,然後對不同的ID的控制元件進行自繪。上圖中可以看出,有兩個按鈕,判斷後呼叫相應的函式進行自繪處理。當然,我都使用了相同的方式自繪。注意,呼叫函式要將第二個引數LPDRAWITEMSTRUCT lpDrawItemStruct傳給自繪函式。這個引數是自繪結構體,有自繪需要的各種資訊。

5.自繪函式編寫。具體的每一句就不詳細解釋了。程式碼中有註釋。

------------------------程式碼段開始---------------------------

void C自繪按鈕Dlg::draw(LPDRAWITEMSTRUCT lpDrawItemStruct){ CDC ButtonDC; CBitmap bitmapTrans; BITMAP bmp; CDC mem; CRect rc; //得到用於繪製按鈕的DC ButtonDC.Attach(lpDrawItemStruct->hDC); //準備用於向按鈕區域傳輸點陣圖 mem.CreateCompatibleDC(&ButtonDC); //獲取按鈕所佔的矩形大小 rc=lpDrawItemStruct->rcItem; //獲取按鈕目前所處的狀態,根據不同的狀態繪製不同的按鈕 UINT state = lpDrawItemStruct->itemState; //如果按鈕已經得到焦點,繪製選中狀態下的按鈕 if(state&ODS_FOCUS) { bitmapTrans.LoadBitmap(IDB_BITMAP2); bitmapTrans.GetBitmap(&bmp); CBitmap *old=mem.SelectObject(&bitmapTrans); //向按鈕所在位置傳輸點陣圖 //使用StretcnBlt的目的是為了讓點陣圖隨按鈕的大小而改變 ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); mem.SelectObject(old); bitmapTrans.DeleteObject(); } else { bitmapTrans.LoadBitmap(IDB_BITMAP1); CBitmap *old2 = mem.SelectObject(&bitmapTrans); bitmapTrans.GetBitmap(&bmp); CBitmap *old=mem.SelectObject(&bitmapTrans); ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); mem.SelectObject(old2); bitmapTrans.DeleteObject(); }}

------------------------程式碼段結束---------------------------

IDB_BITMAP1IDB_BITMAP2是兩個Bitmap資源,需要提前新增以下。

6.執行的結果就是:單擊按鈕(得到焦點)會更換按鈕顯示的圖片,單擊另外的按鈕(失去焦點)後又會恢復之前的圖片。

另外實現的截圖:單擊前:

單擊後:

按鈕控制元件怎麼自繪

按鈕控制元件怎麼自繪

按鈕控制元件怎麼自繪

按鈕, 訊息, 控制元件, 類中,
相關問題答案