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);
}
时间: 2024-10-05 21:50:11

VC自绘控件框架的相关文章

MFC自绘控件学习总结

前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教.我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 20051).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButton

Android自定义控件_自绘控件

控件的划分:自绘控件.组合控件.继承控件 每种方式是如何自定义View的? 第一:自绘控件 继承view,重写onDraw方法,在布局文件里面引用     示例:水波纹 WaterRipplesActivity 1 public class WaterRipplesActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(saved

MFC自绘控件学习总结第二贴

首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/20110710/19/5209f358-31c8-4057-b108-02155a417fd0.html 1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意.可以在这里改变控件的大小,位置,窗口样式,字

VC++使用ActiveX控件连接和操作数据库

VS2008运用ActiveX控件连接和操作数据库关闭时一直有个内存释放的错误,好像使用VC6.0会多生成2个文件,就不会有问题. VC++使用ActiveX控件连接和操作数据库的方法分两种: 1.通过属性窗口连接数据库2.通过代码连接数据库 1.通过属性窗口连接数据库基本步骤:(1)创建一个基于对话框的应用程序ActiveXDB; (2)添加CAdodc控件:对话框上右键单击,选择Insert ActiveX control菜单项,弹出的对话框中选择Microsoft ADO Data Con

VC++ 使用WebBrowser控件中html文件以资源形式加载

1 . . . . 2 3 //加载资源文件中的HTML,IDR_HTML1就是HTML文件在资源文件中的ID 4 wchar_t self_path[MAX_PATH] = { 0 }; 5 GetModuleFileName(NULL, self_path, MAX_PATH); 6 CString res_url; 7 res_url.Format(L"res://%s/%d", self_path, IDR_HTML1); 8 m_webbrowser.Navigate(res

Android 自定义View之自绘控件

首先要提前声明一下,我对于自定义View的理解并不是很深,最近啃了几天guolin博主写的关于自定义View的博客,讲的非常棒,只不过涉及到源码和底层的一些东西,我自己就懵逼了,目前只是会了关于自定义View的简单使用,不过还是要写出来,当做练习了,哈哈~对于一些没有接触过的初学者,希望会有所帮助,共同成长: 按类型,自定义View可以分为三种:自绘控件.组合控件.继承控件,对于这三种类型,我会写三篇博客来分别介绍和使用. 自定义View中有三个非常重要的方法,分别为: onMeasure():

vc 在edit控件中动态插入数据滚动显示

内存从网上论坛摘抄整理 思路:给控件设置多行属性,设置垂直滚动条,Auto Vscroll设置为true,放入文本后把插入点设置到末尾 pEdit->LineScroll(pEdit->GetLineCount()); 滚动条滚动到最下端 int len  = pEdit->GetWindowTextLength(); pEdit->SetSel(len,-1,true); //定位光标到内容末尾pEdit->ReplaceSel("12121212");

自绘控件时添加LBS_OWNERDRAWFIXED风格,离奇报错的解决方案!

   在自绘CListBox的时候本人遇到过一件很头痛的事情,当然,这点小问题对于大牛来说,压根不屑一顾,可是初学者遇到的话,一时半会还真没什么办法解决.      自绘控件很简单,按照书上的步骤一步一步来操作即可,就拿自绘CListBox为例.      我们从CListBox派生出一个子类CListBoxEx,然后添加DrawItem和MeasureItem函数即可.我不知道有多少人和我一样,喜欢通过机器自动给我们添加.     机器添加代码之后,我们的类大概就变成了这样子:       好

VC/MFC ListCtrl 控件功能使用汇总(转)

以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 "ListView_"开头的一些宏.如 ListView_InsertColumn -------------------------------------------------------------------------------- 1. CListCtrl 风格      LVS_ICON: 为每个item显示大图标      LVS_SMALLIC