这是一个按钮自绘的框架,其他控件也类似
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
|
//.h头文件 #pragma once #include "afxwin.h" #include "MemDC.h"//封装内存DC类 class CYuButton : public CWnd
{ private :
BOOL m_bIsDown;
CString m_sCaption;
public :
DECLARE_DYNCREATE(CYuButton)
CYuButton( void );
virtual ~CYuButton( void );
BOOL Create( LPCTSTR sCpation, DWORD dwStyle,CONST CRect & rt,
CWnd * pParendWnd, UINT uId);
afx_msg void OnNcPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg void OnLButtonDown( UINT nFlags, CPoint point);
afx_msg void OnLButtonUp( UINT nFlags, CPoint point);
afx_msg void OnKillFocus(CWnd* pNewWnd);
DECLARE_MESSAGE_MAP()
//鼠标按下
void DrawDown(CDC * pDC);
void DrawNormal(CDC * pDC);
//鼠标移动
void DrawMove(CDC * pDC);
//获取当前程序路径
CString GetApplicationPath();
public :
//修改按钮状态
void SetNormalStatus();
}; |
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
//.cpp文件 #include "StdAfx.h" #include "YuButton.h" CYuButton::CYuButton( void )
{ //WNDCLASS wd={CS_VREDRAW|CS_HREDRAW,::DefWindowProc};
//wd.lpszClassName = _T("YUButton");
} CYuButton::~CYuButton( void )
{ } BOOL CYuButton::Create( LPCTSTR sCaption, DWORD dwStyle,CONST CRect & rt,
CWnd * pParendWnd, UINT uId)
{ LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
AfxGetApp()->LoadStandardCursor(IDC_ARROW),
( HBRUSH )GetStockObject(LTGRAY_BRUSH), NULL);
m_sCaption = sCaption;
return CWnd::Create(lpszClassName,sCaption,dwStyle|WS_CHILD|WS_VISIBLE,
rt,pParendWnd,uId);
} IMPLEMENT_DYNCREATE(CYuButton, CWnd) BEGIN_MESSAGE_MAP(CYuButton, CWnd) ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP() void CYuButton::OnNcPaint()
{ } BOOL CYuButton::OnEraseBkgnd(CDC* pDC)
{ return true ; //CWnd::OnEraseBkgnd(pDC);
} void CYuButton::OnPaint()
{ CPaintDC dc( this ); // device context for painting
if (m_bIsDown)
DrawDown(&dc);
else
DrawNormal(&dc);
//绘按钮上面的文字
CRect rt;
GetClientRect(&rt);
rt.top = 70;
dc.SetTextColor(RGB(255,255,255));
CFont font;
VERIFY(font.CreatePointFont(115,_T( "微软雅黑" ), &dc));
dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(m_sCaption,rt,DT_CENTER|DT_SINGLELINE);
} void CYuButton::OnLButtonDown( UINT nFlags, CPoint point)
{ // TODO: 在此添加消息处理程序代码和/或调用默认值
m_bIsDown = TRUE;
this ->SetFocus();
this ->Invalidate(FALSE);
CWnd * pWnd = this ->GetParent();
if (pWnd)
pWnd->SendMessage(WM_COMMAND,GetDlgCtrlID(),( LPARAM ) this ->GetSafeHwnd());
CWnd::OnLButtonDown(nFlags, point);
} void CYuButton::OnLButtonUp( UINT nFlags, CPoint point)
{ CWnd::OnLButtonUp(nFlags, point);
} void CYuButton::DrawNormal(CDC * pDC)
{ pDC->BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),
&m_CompoundDC,0,0,SRCCOPY);
} void CYuButton::DrawDown(CDC * pDC)
{ } void CYuButton::OnKillFocus(CWnd* pNewWnd)
{ CWnd::OnKillFocus(pNewWnd);
Invalidate(TRUE);
} CString CYuButton::GetApplicationPath() { WCHAR buff[255]={0};
::GetModuleFileName(0,buff,255);
CString strAppFullName;
strAppFullName.Format(_T( "%s" ),buff);
CString strAppPath = _T( "" );
strAppPath = strAppFullName.Left(strAppFullName.ReverseFind( '\\' )+1);
return strAppPath;
} void CYuButton::SetNormalStatus()
{ m_bIsDown = FALSE;
Invalidate(FALSE);
} |
如果继承自CEdit类,希望文字内容垂直居中。
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
|
//创建时的风格,改为多行风格 CEdit::Create(WS_VISIBLE| ES_LEFT| WS_CHILD| ES_MULTILINE, rect, pParentWnd, nID); //通知消息处理如下: BOOL CYUEdit::OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam,
LRESULT * pLResult)
{ if (message != WM_CTLCOLOREDIT)
{
return CEdit::OnChildNotify(message, wParam, lParam, pLResult);
}
HDC hdcChild = ( HDC )wParam;
SetTextColor(hdcChild, m_colFontColor);
SetBkColor(hdcChild, m_colBackGround);
CRect rt1;
GetClientRect(&rt1);
rt1.DeflateRect(0, 0, 0, 0);
SetRectNP(&rt1);
SetFont(&m_font,FALSE);
return TRUE;
//return CEdit::OnChildNotify(message, wParam, lParam, pLResult);
}
|
本文转自Chinayu201451CTO博客,原文链接:http://blog.51cto.com/9233403/1981225 ,如需转载请自行联系原作者