方案:
重写虚函数 DrawItem
先创一个圆角矩型CreateRoundRectRgn.
然后把按钮区域设置在刚建的圆角矩型区域内SetWindowRgn.
最后把按钮画出来RoundRect.
其中,
函数 SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,可以是CreateRectRgn(),CreatePolyRgn(),CreatePolygonRgn(),CreateRoundRectRgn()和 CreateEllipticRgn(),等.
重写虚函数
响应鼠标
这里要注意的地方就是DrawItem是虚函数,而不是消息OnDrawItem.
另外要将OwnerDraw设为true;
重写虚函数 DrawItem
先创一个圆角矩型CreateRoundRectRgn.
然后把按钮区域设置在刚建的圆角矩型区域内SetWindowRgn.
最后把按钮画出来RoundRect.
其中,
函数 SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,可以是CreateRectRgn(),CreatePolyRgn(),CreatePolygonRgn(),CreateRoundRectRgn()和 CreateEllipticRgn(),等.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#pragma once
// CCustomButton
class
CCustomButton :
public
CButton
{
DECLARE_DYNAMIC(CCustomButton)
public
:
CCustomButton();
virtual
~CCustomButton();
protected
:
DECLARE_MESSAGE_MAP()
public
:
// afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
public
:
BOOL
m_IsPressed;
//鼠标是否按下
afx_msg
void
OnLButtonDown(
UINT
nFlags, CPoint point);
afx_msg
void
OnLButtonUp(
UINT
nFlags, CPoint point);
afx_msg
BOOL
OnEraseBkgnd(CDC* pDC);
CBrush m_Brush;
virtual
void
DrawItem(LPDRAWITEMSTRUCT
/*lpDrawItemStruct*/
);
};
|
1
2
3
4
|
CCustomButton::CCustomButton()
{
m_IsPressed = FALSE;
}
|
重写虚函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
void
CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
CRect rect;
//GetClientRect(&rect);
//得到原先按扭区域
rect = lpDrawItemStruct->rcItem;
CDC dc;
//连接到设备环境,(我喜欢称设备上下文为设备环境)
dc.Attach(lpDrawItemStruct->hDC);
m_Brush.CreateStockObject(NULL_BRUSH);
dc.SelectObject(&m_Brush);
if
(m_IsPressed)
//鼠标按下
{
CPen pen(PS_SOLID,2,RGB(255,100,0));
//选择画笔
dc.SelectObject(&pen);
//创建圆角矩型
HRGN
h_rgn = CreateRoundRectRgn(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
//设置按钮区域
SetWindowRgn(h_rgn,TRUE);
//圆出按钮
dc.RoundRect(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
dc.SetTextColor(RGB(255,100,0));
}
else
//鼠标没有按下
{
CPen pen(PS_SOLID,2,RGB(198,198,198));
dc.SelectObject(&pen);
HRGN
h_rgn = CreateRoundRectRgn(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
SetWindowRgn(h_rgn,TRUE);
dc.RoundRect(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
dc.SetTextColor(RGB(255,100,0));
}
CString str;
GetWindowText(str);
//写上文本
dc.DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
删除设备环境
dc.DeleteDC();
}
|
响应鼠标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void
CCustomButton::OnLButtonUp(
UINT
nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_IsPressed = FALSE;
CButton::OnLButtonUp(nFlags, point);
}
BOOL
CCustomButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return
CButton::OnEraseBkgnd(pDC);
}
|
这里要注意的地方就是DrawItem是虚函数,而不是消息OnDrawItem.
另外要将OwnerDraw设为true;