MFC基本控件3-Button的风格

简介: MFC基本控件3-Button的风格

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

我们来看头文件代码:

// 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;
}

下面是函数实现:

// 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;
}
相关文章
|
1月前
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Slider的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Slider的使用及说明
120 2
MFC基本控件2-单选按钮的使用
MFC基本控件2-单选按钮的使用
|
1月前
【Qt 学习笔记】Qt常用控件 | 按钮类控件 | Radio Button的使用及说明
【Qt 学习笔记】Qt常用控件 | 按钮类控件 | Radio Button的使用及说明
183 0
|
10月前
MFC基本控件3-Button的风格
我们继续来了解MFC控件的基本使用, 按钮的使用大家肯定都很熟悉了, 我们今天来了解一下Button按钮的功能扩展怎么实现。
|
10月前
19 MFC - 标签控件 CTabCtrl
19 MFC - 标签控件 CTabCtrl
45 0
|
程序员 开发工具 C语言
Qt编写自定义控件67-通用无边框
一、前言 在之前的一篇文章中写过一个通用的移动控件,作用就是用来传入任意的widget控件,可以在父类容器中自由移动。本篇文章要写的是一个通用的无边框类,确切的说这不叫控件应该叫组件才对,控件是要看得见的东西,有绘制需求的,而这个需要依附在控件上。
928 0
|
程序员 开发工具 C语言
Qt编写自定义控件42-开关按钮
一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。
1410 0
|
开发工具 C语言 索引
Qt编写自定义控件36-图片浏览器
一、前言 本控件主要用来作为一个简单的图片浏览器使用,可以上下翻页显示图片,图片还可以开启过度效果比如透明度渐变,应用场景有查看报警图片运行图片等。此控件非本人原创,来源于网络,我只是修正了好多处BUG,并完善了各种操作方式。
1140 0