MFC 之 CButton 控件重绘(GDI篇)

本文介绍了在MFC中自定义CButton控件的方法,包括CNormalBtn、CMenuBtn和CStaticBtn三种类型。重点讨论了如何处理不同状态(如NoFocus、MouseMove、ButtonDown、Disable)的图片切换,并使用GDI进行双缓冲绘图以实现平滑效果。源代码包括基类BaseBtn的实现。
摘要由CSDN通过智能技术生成

最近在为公司用MFC做产品界面。因为是小公司,所以也没有现成的界面库,必须自己一点一点写。自己在网上收集了点资料,就写了几个类型的button类,以供以后使用。

目前为止,做了三种类型的按钮,分别是:

1.一般情况使用的,比较常用的button类CNormalBtn;

2.特殊一点的,类似拥有菜单功能的button类CMenuBtn(和CNormal的区别是按钮selected后的状态不会随着鼠标的离开而消失);

3.静态按钮,用来呈现log等图片之类的button类CStatic,该类不会响应鼠标事件。

对于1,2种按钮,用的图片模式是:(png格式,一幅图里有四副小图,依次表示NoFoucs,Mousemove, buttondown, Disable四种状态);

对于3类按钮,用的图片模式是:(png格式)


下面贴代码:

基类代码(BaseBtn.h)

#ifndef __BASEBTN_H__
#define __BASEBTN_H__

#include "stdafx.h"
#include <atlimage.h>

#if _MSC_VER > 1000
#pragma once
#endif

class CBaseBtn : public CButton
{
public:
	CBaseBtn();
	~CBaseBtn();

public:
	virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
	virtual void SetFont(CFont* pFont, BOOL bRedraw = TRUE);
	virtual void SetWindowText(LPCTSTR lpszString);
	
public:
	void Init(UINT uImageID);
	void SetBtnTextColor(COLORREF clr);
		
protected:
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);

	DECLARE_MESSAGE_MAP()

protected:
	int			m_nCtrlState;

	CImage		m_Image;
	int			m_nSrcWidth;
	int			m_nSrcHeight;

private:
	CString		m_strBtnText;
	CFont*		m_pFont;
	COLORREF	m_clr;
};

#endif


基类代码(BaseBtn.cpp)

#include "stdafx.h"
#include "BaseBtn.h"
#include "Public.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CBaseBtn::CBaseBtn()
{
	m_pFont = new CFont;
	VERIFY(m_pFont->CreateFont(15, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值