MFC自定义button实现颜色控制

简介: 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

相关文章
|
7月前
|
算法
基于STM32定时器外部计数模式实现方波频率测量
基于STM32定时器外部计数模式实现方波频率测量
|
数据格式 Python
【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?
波特率9600,发送 `01 03 00 00 00 04 44 09` (8字节) 需要多少时间,如何计算?
1499 7
|
存储 监控 数据处理
【STM32】详细讲述 USART_IRQHandler() 的工作流程和原理
- UART5_IRQHandler的主要任务是响应各种UART中断事件并执行相应的处理。 - 典型的处理中断步骤包括检查中断类型、读取或写入数据寄存器、处理数据或错误、清除中断标志等。 - 实际的中断处理逻辑会根据具体应用的需求进行调整。
766 1
|
存储 Python
删除链表节点详解
删除链表节点详解
|
云安全 分布式计算 数据中心
《云安全原理与实践》——1.1 云计算的发展历程
本节书摘来自华章计算机《云安全原理与实践》一书中的第1章,第1.1节,作者:陈兴蜀,葛龙著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
4310 0
|
Web App开发 关系型数据库 MySQL
webserver如何从零开始?
webserver如何从零开始?
奇偶校验,CRC循环冗余校验,海明码校验
奇偶校验,CRC循环冗余校验,海明码校验
1288 0
|
算法 Java 测试技术
【深入探究 C++ 日志库性能比较】glog、log4cplus 和 spdlog 的日志输出性能分析
【深入探究 C++ 日志库性能比较】glog、log4cplus 和 spdlog 的日志输出性能分析
3891 0
|
存储 算法 C语言
【C/C++ 应用开发 检测文件 】详解 C/C++ 中常用的 5 种文件存在检查方式
【C/C++ 应用开发 检测文件 】详解 C/C++ 中常用的 5 种文件存在检查方式
1097 0
QT(QPainter画圆弧)
QT(QPainter画圆弧)
1016 0