• MFC自定义button实现颜色控制


    此自定义按钮可以实现鼠标的点击、释放、hover和leave功能。

    1、新建一个button按钮,修改Owner Drawer的属性为True

    2、在工程新建CCustomButton类

    #pragma once
    
    #include "stdafx.h"
    // CustomButton dialog
    
    class CCustomButton : public CButton
    {
    	DECLARE_DYNAMIC(CCustomButton)
    
    public:
    	CCustomButton();
    	virtual ~CCustomButton();
    	void SetButtonBgColor(COLORREF color);
    	void SetButtonTextColor(COLORREF color);
    
    private:
    	COLORREF m_bgColor;
    	COLORREF m_textColor;
    	BOOL m_bPressed;
    	BOOL m_bTrackingMouse;
    
    protected:
    	DECLARE_MESSAGE_MAP()
    	afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    	afx_msg void OnMouseHover(UINT nFlags, CPoint point);
    	afx_msg void OnMouseLeave();
    
    };
    
    
    
    
    // CustomButton.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "CustomButton.h"
    #include "afxdialogex.h"
    
    
    // CustomButton dialog
    
    IMPLEMENT_DYNAMIC(CCustomButton, CButton)
    
    CCustomButton::CCustomButton()
    {
    	//m_bgColor = RGB(52, 52, 52);
    	//m_textColor = RGB(153, 153, 153);
    	//m_bgColor = RGB(0, 255, 0);
    	//m_textColor = RGB(255, 0, 0);
    	m_bPressed = FALSE;
    	m_bTrackingMouse = true;
    }
    
    CCustomButton::~CCustomButton()
    {
    }
    
    
    BEGIN_MESSAGE_MAP(CCustomButton, CButton)
    	ON_WM_DRAWITEM()
    	ON_WM_MOUSEHOVER()
    	ON_WM_MOUSELEAVE()
    	ON_WM_LBUTTONDOWN()
    	ON_WM_LBUTTONUP()
    	ON_WM_MOUSEMOVE()
    END_MESSAGE_MAP()
    
    
    
    // CCustomButton 消息处理程序
    
    void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    	CRect rect;
    	GetClientRect(rect);
    	CDC dc;
    	dc.Attach(lpDrawItemStruct->hDC);
    
    	//	UINT state = lpDrawItemStruct->itemState;
    		//CRect focusRect(rect);
    		//focusRect.DeflateRect(4, 4, 4, 4);
    
    	if (m_bTrackingMouse)
    	{
    		m_bgColor = RGB(0, 255, 0);
    		m_textColor = RGB(255, 0, 0);
    		CPen pen(PS_DOT, 1, m_bgColor);
    		CBrush brush;
    		brush.CreateStockObject(NULL_BRUSH);
    		dc.SelectObject(&brush);
    		dc.SelectObject(&pen);
    		dc.FillSolidRect(rect, m_bgColor);
    		dc.Rectangle(rect);
    
    		CString strText;
    		GetWindowText(strText);
    		//m_bgColor = RGB(52, 52, 52);
    		//m_textColor = RGB(153, 153, 153);
    
    
    		dc.SetBkColor(m_bgColor);
    		dc.SetTextColor(m_textColor);
    		dc.DrawText(strText, rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
    
    	}
    	else
    	{
    		m_bgColor = RGB(255, 0, 0);
    		m_textColor = RGB(0, 255, 0);
    		CPen pen(PS_DOT, 1, m_bgColor);
    		CBrush brush;
    		brush.CreateStockObject(NULL_BRUSH);
    		dc.SelectObject(&brush);
    		dc.SelectObject(&pen);
    		dc.FillSolidRect(rect, m_bgColor);
    		dc.Rectangle(rect);
    
    		CString strText;
    		GetWindowText(strText);
    		//m_bgColor = RGB(40, 53, 69);
    		//m_textColor = RGB(46, 189, 255);
    
    
    		dc.SetBkColor(m_bgColor);
    		dc.SetTextColor(m_textColor);
    		dc.DrawText(strText, rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
    
    		//dc.DrawText(strText, rect);
    
    		//CBrush brush(RGB(255, 0, 0));
    		//dc.FillRect(&(lpDrawItemStruct->rcItem), &brush);
    		//DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
    		//	&lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
    //		SetBkMode(lpDrawItemStruct->hDC, TRANSPARENT);
    	}
    
    	// button字体
    	//CString strText;
    	//GetWindowText(strText);
    	//dc.SetBkMode(TRANSPARENT);
    	//dc.SetTextColor(m_textColor);
    	///*if () {
    	//	dc.SetTextColor(RGB(172, 168, 153));
    	//}*/
    	//dc.DrawText(strText, rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
    	dc.Detach();
    }
    
    //按钮被按下
    void CCustomButton::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	m_bPressed = TRUE;
    	CButton::OnLButtonDown(nFlags, point);
    }
    
    //按钮被释放
    void CCustomButton::OnLButtonUp(UINT nFlags, CPoint point)
    {
    	m_bPressed = FALSE;
    	CButton::OnLButtonDown(nFlags, point);
    }
    //设置按钮背景的颜色 
    void CCustomButton::SetButtonBgColor(COLORREF color)
    {
    	m_bgColor = color;
    }
    
    //设置按钮字体的颜色
    void CCustomButton::SetButtonTextColor(COLORREF color)
    {
    	m_textColor = color;
    }
    
    void CCustomButton::OnMouseMove(UINT nFlags, CPoint point)
    {
    	if (m_bTrackingMouse)
    	{
    		TRACKMOUSEEVENT tme;
    		tme.cbSize = sizeof(TRACKMOUSEEVENT);
    		tme.dwFlags = TME_LEAVE | TME_HOVER;
    		tme.hwndTrack = GetSafeHwnd();
    		tme.dwHoverTime = 10;     // 影响OnMouseHover函数的响应时间,设置小点。
    		if (::TrackMouseEvent(&tme))
    		{
    			m_bTrackingMouse = false;
    		}
    	}
    
    	CButton::OnMouseMove(nFlags, point);
    }
    
    void CCustomButton::OnMouseHover(UINT nFlags, CPoint point)
    {
    	//HDC hdc;
    	//hdc = ::GetDC(this->GetParent()->GetSafeHwnd());
    	//HPEN hpen = ::CreatePen(PS_SOLID, 1, RGB(255, 0, 0));//创建画笔
    	//HPEN oHpen;
    	//oHpen = (HPEN)::SelectObject(hdc, hpen);//把新的画笔填充到DC
    	Invalidate();
    
    	//CButton* btn = (CButton*)this->GetParent()->GetDlgItem(IDC_BUTTON1)->SetFaceColor(RGB(0, 255, 0));
    
    	m_bTrackingMouse = false;
    	CButton::OnMouseHover(nFlags, point);
    }
    
    void CCustomButton::OnMouseLeave()
    {
    	/*CRect rt;
    	GetClientRect(&rt);
    	InvalidateRect(rt);
    	*/
    	Invalidate();
    
    	m_bTrackingMouse = true;
    	CButton::OnMouseLeave();
    }
    
    
    

    3、点击工程的视图界面,右键按钮,选择"增加变量",将原来类名CButton修改名为CCustomButton

  • 相关阅读:
    JVM常用参数设置
    Jstat在分析java的内存GC时的应用
    jstack来分析linux服务器上Java应用服务性能异常
    linux 远程连接服务器ftp命令整理
    LR11中webservice协议的性能测试应用
    Windbg在.net性能问题排查hang情况的应用思路
    Windbg基本命令应用总结
    LR11直接对数据库访问操作方法在性能测试中的应用总结
    BenchmarkSQL v5.0测试达梦数据库
    SSH登录时间久,登录后报错:'abrt-cli status' timed out
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16369994.html
Copyright © 2020-2023  润新知