您的位置:首页 > 其它

MFC重绘的按钮控件

2015-06-04 22:02 225 查看
算是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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: