MFC基本控件3-Button的风格

简介: 我们继续来了解MFC控件的基本使用, 按钮的使用大家肯定都很熟悉了, 我们今天来了解一下Button按钮的功能扩展怎么实现。

   我们继续来了解MFC控件的基本使用, 按钮的使用大家肯定都很熟悉了, 我们今天来了解一下Button按钮的功能扩展怎么实现。


我们来看头文件代码:

#pragma once
// CMyButton
class CMyButton : public CButton
{
  DECLARE_DYNAMIC(CMyButton)
public:
  CMyButton();
  virtual ~CMyButton();
  CFont m_fontMouseMove;  //鼠标移动到按钮上时用的字体
  HCURSOR m_hCurSorMouseMove; //鼠标移动到按钮上时用的光标
  BOOL  m_isLButtonDown;  //鼠标左键是否按下
  BOOL  m_isMouseInButton;  //鼠标是否在按钮上面
protected:
  DECLARE_MESSAGE_MAP()
public:
  virtual 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 OnTimer(UINT_PTR nIDEvent);//计时器
  afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);//设置光标
};


下面是函数实现:

// CMyButton.cpp: 实现文件
//
#include "pch.h"
#include "class08.h"
#include "CMyButton.h"
// CMyButton
IMPLEMENT_DYNAMIC(CMyButton, CButton)
CMyButton::CMyButton()
{
}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
  ON_WM_LBUTTONDOWN()
  ON_WM_LBUTTONUP()
  ON_WM_MOUSEMOVE()
  ON_WM_TIMER()
  ON_WM_SETCURSOR()
END_MESSAGE_MAP()
// CMyButton 消息处理程序
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
  //整个按钮的外观都是在这里进行绘制
  CDC* pDc = CDC::FromHandle(lpDrawItemStruct->hDC);//获取dc
  CRect rect(lpDrawItemStruct->rcItem);//按钮的rect结构
  pDc->SetBkMode(TRANSPARENT);
  UINT buttonState = lpDrawItemStruct->itemState;//获取按钮状态
  CFont* pOldFont = NULL;
  CString strText;
  GetWindowText(strText);
  if (m_isMouseInButton)
  {
    if (buttonState & ODS_SELECTED)//判断有没有点击按钮
    {
      pDc->Draw3dRect(rect,//指定范围内的矩形
        GetSysColor(COLOR_3DSHADOW),//三维矩形的顶部和左侧的颜色
        GetSysColor(COLOR_3DHILIGHT)//三维矩形的底部和右侧的颜色
      );
    }
    else
      pDc->Draw3dRect(rect, GetSysColor(COLOR_3DHILIGHT), GetSysColor(COLOR_3DSHADOW));
    pDc->SetTextColor(RGB(255, 0, 0));
    if (m_fontMouseMove.GetSafeHandle() == NULL)
    {
      CFont* font = GetFont();
      LOGFONT lf;
      font->GetLogFont(&lf);
      lf.lfUnderline = true;
      m_fontMouseMove.CreateFontIndirect(&lf);
    }
    pOldFont = pDc->SelectObject(&m_fontMouseMove);
  }
  else
  {
    pDc->SetTextColor(RGB(0, 0, 0));
  }
  pDc->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  if (pOldFont)
    pDc->SelectObject(pOldFont);
  // TODO:  添加您的代码以绘制指定项
}
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  m_isLButtonDown = true;
  CButton::OnLButtonDown(nFlags, point);
}
void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  m_isLButtonDown = false;
  if (m_isMouseInButton)
  {
    m_isMouseInButton = false;
    InvalidateRect(NULL);//整个按钮的区域无效
  }
  CButton::OnLButtonUp(nFlags, point);
}
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  SetTimer(1, 10, NULL);
  CButton::OnMouseMove(nFlags, point);
}
void CMyButton::OnTimer(UINT_PTR nIDEvent)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  static BOOL bPainted = false; //防止重绘用的
  POINT pt;
  GetCursorPos(&pt);//获取鼠标关于屏幕的位置
  CRect rect;
  GetWindowRect(&rect);//获得CWnd的屏幕坐标
  if (m_isLButtonDown)
  {
    KillTimer(1);
    return;
  }
  if (!rect.PtInRect(pt))//判断光标的坐标在不在按钮的矩形区域内
  {
    m_isMouseInButton = false;
    KillTimer(1);
    if (bPainted)
      InvalidateRect(NULL);
    bPainted = false;
    return;
  }
  else
  {
    m_isMouseInButton = true;
    if (!bPainted)
    {
      bPainted = true;
      InvalidateRect(NULL);
    }
  }
  CButton::OnTimer(nIDEvent);
}
BOOL CMyButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  if (m_isMouseInButton)
  {
    ::SetCursor(::LoadCursorFromFile(_T("res\\CURSOR1.CUR")));
  }
  //return CButton::OnSetCursor(pWnd, nHitTest, message);//需要注释掉
  return true;
}




相关文章
|
4月前
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Slider的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Slider的使用及说明
515 2
|
4月前
【Qt 学习笔记】Qt常用控件 | 按钮类控件 | Radio Button的使用及说明
【Qt 学习笔记】Qt常用控件 | 按钮类控件 | Radio Button的使用及说明
706 1
MFC基本控件3-Button的风格
MFC基本控件3-Button的风格
MFC基本控件2-单选按钮的使用
MFC基本控件2-单选按钮的使用
|
C++ Windows
Qt-QML-Popup,弹层界面编写
随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样。最近项目的祝界面框架都基本写完了,那自我感觉良好,感觉自己QML的不得了了,全部用的都是自己YY出来的空间,今天小伙伴在同伴代码后,用到了我的模块,给我说了一个BUG,
542 0
Qt-QML-Popup,弹层界面编写
UGUI系列-Dropdown控件研究(Unity3D)
Dropdown下拉列表,控件还是很强大的,做UI的时候用的比较多,现在就将Dropdown使用中的一些经验总结起来,分享给大家了
|
开发工具 C语言
Qt编写自定义控件33-图片切换动画
一、前言 在很多看图软件中,切换图片的时候可以带上动画过渡或者切换效果,显得更人性化,其实主要还是炫一些,比如百叶窗、透明度变化、左下角飞入等,无论多少种效果,核心都是围绕QPainter来进行,将各种动画效果对应的图片的区域动态计算并绘制出来,配合以QPropertyAnimation动画属性产生线性插值,比如渐入飞入时候,可以中间快速两端慢速。
1045 1
Qt编写自定义控件30-颜色多态按钮
一、前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得当时接到这个定制控件任务的时候是2016年,那时候对QPainter的使用还不是很熟悉,也就是从此控件开始,逐步研究QPainter的绘制,把所有的内置函数都使用一遍,最终用的越来越熟悉,使得后来到了心中有坐标,万物皆painter的境界,可能就像武林中所说的打通了任督二脉吧。
1185 0
|
C#
WPF 自定义模板 Button闪亮效果
原文:WPF 自定义模板 Button闪亮效果 Button的选中Effect,我们看下下面的效果:   让我们再放大一点: 怎么设置上面样式呢?直接设置Button的Effect,有点问题,因为Effect不是四周环绕的。
596 0

热门文章

最新文章