示例一:
Step1: 創(chuàng)建對(duì)話框工程。
Step2: 添加要自繪的按鈕,為每個(gè)按鈕添加一個(gè)位圖
Step3: 添加WM_DRAWITEM 消息的響應(yīng)函數(shù)OnDrawItem實(shí)現(xiàn)具體的自繪,詳細(xì)實(shí)現(xiàn)方式參考函數(shù)實(shí)現(xiàn)代碼
Step4: 本示例是根據(jù)ODS_FOCUS狀態(tài)進(jìn)行定制。還可以進(jìn)行其他狀態(tài)的繪制。控件自繪只需要記住一點(diǎn):隨時(shí)訪問MEASUREITEMSTRUCT數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)成員是進(jìn)行自繪的關(guān)
//通過消息WM_DRAWITEM自繪按紐
void CMyBtnDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)


{
// TODO: Add your message handler code here and/or call default
::CDC BtnDC;
::CBitmap bitmapTrans;
::BITMAP bmp;
::CDC mem;
::CRect rc;

//得到用于繪制按鈕的DC(從HDC得到一個(gè)CDC)
BtnDC.Attach(lpDrawItemStruct->hDC);
//準(zhǔn)備用于向按鈕區(qū)域傳輸位圖
mem.CreateCompatibleDC(&BtnDC);
//獲取按鈕所占的矩形大小
rc = lpDrawItemStruct->rcItem;
//獲取按鈕目前所處的狀態(tài),根據(jù)不同狀態(tài)繪制不同的按鈕
UINT uState = lpDrawItemStruct->itemState;
//如果是按鈕已經(jīng)得到焦點(diǎn),繪制選中狀態(tài)下的按鈕
if(uState & ODS_FOCUS)

{
//該函數(shù)從模塊的可執(zhí)行文件中加載指定的位圖資源
bitmapTrans.LoadBitmap(IDB_GETFOCUS);//切記是位圖ID
//本函數(shù)用于查看CBitmap對(duì)象的信息。返回的信息存放
//在pBitMap指向的BITMAP結(jié)構(gòu)中。
bitmapTrans.GetBitmap(&bmp);
//該函數(shù)選擇一對(duì)象到指定的設(shè)備上下文環(huán)境中,該新對(duì)象替換先前的相同類型的對(duì)象。
::CBitmap *old = mem.SelectObject(&bitmapTrans);
//向按鈕所在位置傳輸位圖
//使用StretchBlt的目的是為了讓位圖隨按鈕大小而改變
BtnDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);

mem.SelectObject(old);
bitmapTrans.DeleteObject();

//設(shè)置文字背景為透明
BtnDC.SetBkMode(TRANSPARENT);
//繪制按鈕標(biāo)題
BtnDC.DrawText("已選中", &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

}
else

{
bitmapTrans.LoadBitmap(IDB_LOSTFOCUS);
bitmapTrans.GetBitmap(&bmp);
::CBitmap *old2 = mem.SelectObject(&bitmapTrans);
// ::CBitmap *old = mem.SelectObject(&bitmapTrans);
//向按鈕所在位置傳輸位圖
//使用StretchBlt的目的是為了讓位圖隨按鈕大小而改變
BtnDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);

//設(shè)置文字背景為透明
BtnDC.SetBkMode(TRANSPARENT);
//繪制按鈕標(biāo)題
BtnDC.DrawText("未選中",&rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

mem.SelectObject(old2);
bitmapTrans.DeleteObject();
}

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}