VC自绘控件框架

简介:

这是一个按钮自绘的框架,其他控件也类似

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  ,如需转载请自行联系原作者

相关文章
|
Windows
将现有MFC应用程序迁移到BCGControlBar VC界面库中
1、安装BCGControlBar(安装完成后进行编译) 默认安装路径:C:\Program Files (x86)\BCGSoft\BCGControlBarPro 2、vs2010新建BCG项目(根据向...
1624 0