MFC重绘的按钮控件

算是MFC重绘中最基础的一个部分了,重绘一个按钮控件!自己结合网上代码写的,给大家参考一下!

#pragma once

// CNormalButton

class CNormalButton : public CButton
{
private:
	//各种颜色
	COLORREF m_normalBorderColor;//正常边框颜色
	COLORREF m_overBorderColor;//鼠标位于按钮之上的按钮边框颜色
	COLORREF m_downBorderColor;//鼠标按下的边框颜色
	COLORREF m_textColor;//按钮文本颜色
	COLORREF m_overBgColor;//鼠标位于按钮之上的按钮背景颜色
	COLORREF m_normalBgColor;//按钮正常背景颜色
	COLORREF m_downBgColor;//鼠标按下的背景颜色
	COLORREF m_disabledBgColor;//按钮被禁用背景颜色
	CFont m_textFont;//按钮文本字体


	//按钮的状态
	bool m_bOver;	//鼠标位于按钮之上时该值为true,反之为flase
	bool m_bTracking;	//在鼠标按下没有释放时该值为true
	bool m_bSelected;	//按钮被按下是该值为true
	bool m_bFocus;	//按钮为当前焦点所在时该值为true
	bool m_bDisabled;//按钮被禁用时值为true

	DECLARE_DYNAMIC(CNormalButton)

public:
	CNormalButton();
	virtual ~CNormalButton();

protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnMouseHover(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnMouseLeave();
	virtual void PreSubclassWindow();
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};


// NormalButton.cpp : 实现文件
//

#include "stdafx.h"
#include "NormalButton.h"


// CNormalButton

IMPLEMENT_DYNAMIC(CNormalButton, CButton)

CNormalButton::CNormalButton()
{
	m_normalBorderColor = RGB(196, 196 ,196);
	m_overBorderColor = RGB(142, 174 ,212);
	m_downBorderColor = RGB(117, 150 ,191);
	m_textColor = RGB(0, 0, 0);
	m_overBgColor = RGB(230 ,240, 247);
	m_normalBgColor = RGB(243, 243, 243);
	m_downBgColor = RGB(208, 229, 250);
	m_disabledBgColor = RGB(240, 240, 240);
	m_textFont.CreatePointFont(100, _T("宋体"));

	m_bOver = false;
	m_bTracking = false;
	m_bSelected = false;
	m_bFocus = false;
	m_bDisabled = false;
}

CNormalButton::~CNormalButton()
{
	m_textFont.DeleteObject();
}


BEGIN_MESSAGE_MAP(CNormalButton, CButton)
	ON_WM_MOUSEHOVER()
	ON_WM_MOUSEMOVE()
	ON_WM_MOUSELEAVE()
END_MESSAGE_MAP()



// CNormalButton 消息处理程序




void CNormalButton::OnMouseHover(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bOver = TRUE;
	InvalidateRect(NULL);

	CButton::OnMouseHover(nFlags, point);
}


void CNormalButton::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	if (!m_bTracking)
	{
		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE | TME_HOVER;
		tme.dwHoverTime = 1;
		m_bTracking = _TrackMouseEvent(&tme);
	}

	CButton::OnMouseMove(nFlags, point);
}


void CNormalButton::OnMouseLeave()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bOver = FALSE;
	m_bTracking = FALSE;
	InvalidateRect(NULL, FALSE);

	CButton::OnMouseLeave();
}


void CNormalButton::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类

	CButton::PreSubclassWindow();
	ModifyStyle(0, BS_OWNERDRAW);
}


void CNormalButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	// TODO:  添加您的代码以绘制指定项
	//从lpDrawItemStruct获取控件的相关信息
	CRect rect =  lpDrawItemStruct->rcItem;
	CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
	int nSaveDC=pDC->SaveDC();
	UINT state = lpDrawItemStruct->itemState;
	TCHAR strText[MAX_PATH + 1];
	::GetWindowText(m_hWnd, strText, MAX_PATH);

	//获取按钮的状态
	if (state & ODS_DISABLED)
	{
		m_bDisabled = true;
	}
	else
	{
		m_bDisabled = false;
	}

	if (state & ODS_FOCUS)
	{
		m_bFocus = true;
		m_bSelected = false;
		if (state & ODS_SELECTED)
		{
			m_bSelected = true;
		}
	}
	else
	{
		m_bFocus = false;
		m_bSelected = false;
	}
	
	//根据按钮的状态画出按钮
	CPen* pBorderPen = new CPen();
	pBorderPen->CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, m_normalBorderColor);
	pDC->SelectObject(pBorderPen);

	CBrush* pBgBrush = new CBrush();
	COLORREF nowBgColor;
	
	if (m_bDisabled)
	{
		nowBgColor = m_disabledBgColor;
	}
	else
	{
		if (m_bSelected)
		{
			nowBgColor = m_downBgColor;
			pBorderPen->DeleteObject();
			pBorderPen->CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, m_downBorderColor);
	        pDC->SelectObject(pBorderPen);
		}
		else if (m_bOver || m_bFocus)
		{
			nowBgColor = m_overBgColor;
			pBorderPen->DeleteObject();
			pBorderPen->CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, m_overBorderColor);
	        pDC->SelectObject(pBorderPen);
	    }
	    else
	    {
			nowBgColor = m_normalBgColor;
    	}
	}
	
	pBgBrush->CreateSolidBrush(nowBgColor);
	pDC->SelectObject(pBgBrush);
	pDC->Rectangle(rect);
	
	//显示按钮的文本
	if (strText != NULL)
	{
		CFont* hOldFont = pDC->SelectObject(&m_textFont);
	    pDC->SetBkColor(nowBgColor);
		CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
		CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
		if (m_bSelected) 
			pt.Offset(1, 1);
		pDC->TextOutW(pt.x, pt.y, strText, lstrlen(strText));
		pDC->SelectObject(hOldFont);
	}
	
	pDC->RestoreDC(nSaveDC);
	pBorderPen->DeleteObject();
	pBgBrush->DeleteObject();
}


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值