代码如下:
添加 ON_WM_DRAWITEM() 消息
映射 afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); 函数
实现如下:
void CBtnDrawDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//ADD A PICTURE TO BUTTON
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_BITMAP1);
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();
//设置文字背景为透明
ButtonDC.SetBkMode(TRANSPARENT);
ButtonDC.DrawText("已选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
else
{
bitmapTrans.LoadBitmap(IDB_BITMAP2);
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);
ButtonDC.SetBkMode(TRANSPARENT);
ButtonDC.DrawText("未选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
mem.SelectObject(old2);
bitmapTrans.DeleteObject();
}
}
CPen m_OutBorderPen;
CBrush m_BackgroundBrush;
实现如下:
void CBtnDrawDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//REDRAW BUTTON
CRect rect = lpDrawItemStruct->rcItem;
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSavedDC = pDC->SaveDC();
//绘制按钮的外边框
POINT pt;
pt.x = 5;
pt.y = 5;
CPen *pOldPen = pDC->SelectObject(&m_OutBorderPen);
pDC->RoundRect(&rect, pt);
pDC->SelectObject(pOldPen);
// 绘制按钮的底色
rect.DeflateRect(3, 3, 3, 3);
CBrush *pOldBrush = pDC->SelectObject(&m_BackgroundBrush);
pDC->Rectangle(rect);
pDC->SelectObject(pOldBrush);
//绘制按钮文本
TCHAR strButtonText[MAX_PATH + 1];
::GetWindowText(m_hWnd, strButtonText, MAX_PATH); // 获取按钮文本
if (strButtonText != NULL)
{
CFont *pFont = GetFont();
CFont *pOldFont = pDC->SelectObject(pFont);
CSize szExtent = pDC->GetTextExtent(strButtonText, _tcslen(strButtonText));
CRect rectText = lpDrawItemStruct->rcItem;
rectText.DeflateRect(rect.CenterPoint().x - szExtent.cx / 2,
rect.CenterPoint().y - szExtent.cy / 2, rect.CenterPoint().x - szExtent.cx / 2,
rect.CenterPoint().y - szExtent.cy / 2);
int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
UINT state = lpDrawItemStruct->itemState;
if (state & ODS_SELECTED)
{
rectText.OffsetRect(1, 1);
}
pDC->DrawText(strButtonText, -1, rectText, DT_WORDBREAK | DT_CENTER);
pDC->SelectObject(pOldFont);
pDC->SetBkMode(nOldBkMode);
}
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}