示例一:
Step1: 創(chuàng)建對話框工程。
Step2: 添加要自繪的按鈕,為每個按鈕添加一個位圖
Step3: 添加WM_DRAWITEM 消息的響應(yīng)函數(shù)OnDrawItem實現(xiàn)具體的自繪,詳細實現(xiàn)方式參考函數(shù)實現(xiàn)代碼
Step4: 本示例是根據(jù)ODS_FOCUS狀態(tài)進行定制。還可以進行其他狀態(tài)的繪制。控件自繪只需要記住一點:隨時訪問MEASUREITEMSTRUCT數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)成員是進行自繪的關(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得到一個CDC)
BtnDC.Attach(lpDrawItemStruct->hDC);
//準備用于向按鈕區(qū)域傳輸位圖
mem.CreateCompatibleDC(&BtnDC);
//獲取按鈕所占的矩形大小
rc = lpDrawItemStruct->rcItem;
//獲取按鈕目前所處的狀態(tài),根據(jù)不同狀態(tài)繪制不同的按鈕
UINT uState = lpDrawItemStruct->itemState;
//如果是按鈕已經(jīng)得到焦點,繪制選中狀態(tài)下的按鈕
if(uState & ODS_FOCUS)

{
//該函數(shù)從模塊的可執(zhí)行文件中加載指定的位圖資源
bitmapTrans.LoadBitmap(IDB_GETFOCUS);//切記是位圖ID
//本函數(shù)用于查看CBitmap對象的信息。返回的信息存放
//在pBitMap指向的BITMAP結(jié)構(gòu)中。
bitmapTrans.GetBitmap(&bmp);
//該函數(shù)選擇一對象到指定的設(shè)備上下文環(huán)境中,該新對象替換先前的相同類型的對象。
::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);
//繪制按鈕標題
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);
//繪制按鈕標題
BtnDC.DrawText("未選中",&rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

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

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}