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

{
//該函數從模塊的可執行文件中加載指定的位圖資源
bitmapTrans.LoadBitmap(IDB_GETFOCUS);//切記是位圖ID
//本函數用于查看CBitmap對象的信息。返回的信息存放
//在pBitMap指向的BITMAP結構中。
bitmapTrans.GetBitmap(&bmp);
//該函數選擇一對象到指定的設備上下文環境中,該新對象替換先前的相同類型的對象。
::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();

//設置文字背景為透明
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);

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

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

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}