第二步:定义各函数
| //CcolorButton.cpp …… // CColorButton IMPLEMENT_DYNAMIC(CColorButton, CButton) CColorButton::CColorButton() { } CColorButton::~CColorButton() { } //定义Attach()函数 BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor) { if (!SubclassDlgItem(nID, pParent)) return FALSE; m_fg = FGColor; m_bg = BGColor; return TRUE; } //重载DrawItem() void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); UINT state = lpDIS->itemState; CRect focusRect, btnRect; focusRect.CopyRect(&lpDIS->rcItem); //按纽的选中虚线框 btnRect.CopyRect(&lpDIS->rcItem); // 设置表示按纽被选中的虚线框 focusRect.left += 4; focusRect.right -= 4; focusRect.top += 4; focusRect.bottom -= 4; // 按纽标题 const int bufSize = 512; TCHAR buffer[bufSize]; GetWindowText(buffer, bufSize); // 绘制并标志按纽 DrawFilledRect(pDC, btnRect, GetBGColor()); DrawFrame(pDC, btnRect); DrawButtonText(pDC, btnRect, buffer, GetFGColor()); // 如果按纽处于选中状态则在其上绘制选中虚线框 if (state & ODS_FOCUS) { DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect); } } void CColorButton::DrawFrame(CDC *DC, CRect R) { //绘制按纽,用户通过定制该函数可实现不同形状的按纽。 DrawLine(DC, R.left, R.top, R.right, R.top, RGB(255, 255, 255)); DrawLine(DC, R.left, R.top, R.left, R.bottom, RGB(255, 255, 255)); //以下绘制按纽的外围框线以使按纽有立体感 DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1)); //绘制按纽左框线和上框线 DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1)); //绘制按纽右框线和下框线 } //用色彩填充按纽框 void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color) { CBrush B; B.CreateSolidBrush(color); DC->FillRect(R, &B); } // DrawLine用于绘制按纽,其为多态函数 void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF color) { …… } void CColorButton::DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color) { …… } //绘制按纽文本 void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor) { COLORREF prevColor = DC->SetTextColor(TextColor); DC->SetBkMode(TRANSPARENT); DC->DrawText(Buf, strlen(Buf), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE); DC->SetTextColor(prevColor); } |
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询



