=============================================================
标题:MFC下按钮自绘的实现(三)
摘要:
备注:MFC + VC2005
日期:2010.7.20
姓名:朱铭雷
=============================================================
按钮的绘制主要在DrawItem函数中来完成,下面来简单的绘制一下。
第一步先绘制按钮的外边框。定义了一个成员变量:
CPen m_OutBorderPen;
这是一个用来绘制按钮外边框的画笔,在类的构造函数中创建它,在类的析构函数中销毁之。然后在DrawItem函数中开始绘制按钮的外边框:
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);
pDC->DrawText(strButtonText, -1, rectText, DT_WORDBREAK | DT_CENTER);
pDC->SelectObject(pOldFont);
pDC->SetBkMode(nOldBkMode);
}
重新编译,执行效果如下:
按钮的基本外观已经绘制出来了。接下来还要绘制按钮按下时,光标滑过时,光标离开时等等状态下按钮的外观。当然还要探索一下圆形按钮,三角形按钮,以及不规则图形按钮的绘制。累了,先写到这里。