VC自绘控件框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC自绘控件框架相关的知识,希望对你有一定的参考价值。

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

//.h头文件
#pragma once
#include "afxwin.h"
#include "MemDC.h"//封装内存绘图类

class CYuButton :public CWnd
{
    private:
		BOOL  m_bIsDown;
		BOOL  m_bIsMove;
		BOOL  _bMouseTrack;

		CString  m_sCaption;
		CFont    *m_pFont;
		
		
        CString    m_strFocusPic;//焦点图片
		CString    m_strForePic; //前景图片

		CMemoryDC  m_Icon_MDC;
		CMemoryDC  m_focus_MDC;
		CMemoryDC  m_fore_MDC;
    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);
		//字体
		void SetFont(CFont * pFont);
		CFont * GetFont();
		
	    
		//获取当前程序路径
		CString  GetApplicationPath();
public:
		//修改按钮状态
		void SetNormalStatus();
};
//.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;
	m_pFont = pParendWnd->GetFont();
	return CWnd::Create(lpszClassName,sCaption,dwStyle|WS_CHILD,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)
{
	CMemoryDC  m_CompoundDC(m_focus_MDC.Width(),m_focus_MDC.Height(),pDC);//空白内存位图

	m_CompoundDC.BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),&m_focus_MDC,0,0,SRCCOPY);
    m_fore_MDC.BitTrans(0,0,m_fore_MDC.Width(),m_fore_MDC.Height(),
    &m_CompoundDC,0,0,RGB(135,200,241));

	pDC->BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),&m_CompoundDC,0,0,SRCCOPY);
}


void CYuButton::DrawDown(CDC * pDC)
{
	//画小图标
 	pDC->BitBlt(0,0,m_Icon_MDC.Width(),m_Icon_MDC.Height(),&m_Icon_MDC,0,0,SRCCOPY);
}

void CYuButton::SetFont(CFont * pFont)
{
	m_pFont = pFont;
}

CFont * CYuButton::GetFont()
{
    return m_pFont;
}


void CYuButton::OnKillFocus(CWnd* pNewWnd)
{
	CWnd::OnKillFocus(pNewWnd);
	m_bIsMove = FALSE;
	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);
}


以上是关于VC自绘控件框架的主要内容,如果未能解决你的问题,请参考以下文章

VC如果得到其他程序窗口的控件句柄

Button控件自绘

自绘listCtrl控件选中该行高亮(模拟windows)

控件的自绘

VC MFC 框架中 添加按钮控件

WPF 实现自绘验证码