更新时间:2016-04-21 11:22:02浏览次数:1+次
下面,我们先看看实现:
下面先给出源码:
int CMybutton::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CButton::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
SetWindowRgn(m_hRgn,true);
return 0;
}
void CMybutton::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0,BS_OWNERDRAW | BS_PUSHBUTTON);
CButton::PreSubclassWindow();
}
void CMybutton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
CDC* pDC = CDC::FromHandle(lpDrawItemStruct -> hDC);
CRect rect;
GetClientRect(rect);
DrawButton(pDC, &rect, lpDrawItemStruct -> itemState);
}
void CMybutton::DrawButton(CDC * pDC, CRect * pRect, UINT state)
{
// 创建内存设备
HRGN hBaseRgn = CreateRectRgn(0, 0, 0, 0);
HBRUSH hBrush;
COLORREF ltInner; //左上内存边框的颜色
ltInner = GetSysColor(COLOR_3DHILIGHT);
COLORREF rbOuter; //右下外侧边框的颜色
rbOuter = GetSysColor(COLOR_3DDKSHADOW);
HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
GetWindowRgn(hRgn);
CString text;
GetWindowText(text);
CSize Extent=pDC->GetTextExtent(text);
CPoint pt=CPoint(m_CenterPoint.x-Extent.cx/2,m_CenterPoint.y-Extent.cy/2);
SetTextColor(pDC->GetSafeHdc(),RGB(255,0,0));
CombineRgn(hBaseRgn, hRgn, 0, RGN_COPY);
OffsetRgn(hBaseRgn, 1, 1);
CombineRgn(hBaseRgn, hRgn, hBaseRgn, RGN_DIFF);//得到左上框的部分并上色为红色
hBrush = CreateSolidBrush(ltInner);
FillRgn(*pDC, hBaseRgn, hBrush);
DeleteObject(hBrush);
CombineRgn(hBaseRgn, hRgn, 0, RGN_COPY);
OffsetRgn(hBaseRgn, -1, -1);
CombineRgn(hBaseRgn, hRgn, hBaseRgn, RGN_DIFF);//得到右上框的部分并上色为红色
hBrush = CreateSolidBrush(rbOuter);
FillRgn(*pDC, hBaseRgn, hBrush);
DeleteObject(hBrush);
if (state & ODS_SELECTED)
{
//向一个点中添加x,y坐标
pt.Offset(1,1);
}
TextOut(pDC->GetSafeHdc(), pt.x, pt.y, text, text.GetLength());
}
BOOL CMybutton::Create(LPCTSTR lpszCaption, DWORD dwStyle, const CPoint point, const HRGN hRgn, CWnd* pParentWnd, UINT nID)
{
// store region in member variable
DeleteObject(m_hRgn);
m_hRgn = CreateRectRgn(0, 0, 31, 31);
CRect box(0, 0, 0, 0);
if (m_hRgn != 0)
CombineRgn(m_hRgn, hRgn, 0, RGN_COPY);
// make sure that region bounding rect is located in (0, 0)
GetRgnBox(m_hRgn, &box);
// update position of region center for caption output
m_CenterPoint = CPoint(box.Width()/2,box.Height()/2);
box.OffsetRect(point);
return CButton::Create(lpszCaption, dwStyle, box, pParentWnd, nID);
}
以上是派生类中cpp文件的代码,其头文件的代码我就不啰嗦了。你自己也应该会!相关资讯