【MFC】Button控件美化(自绘)

在MFC中Button控件不能通过OnCtlColor()函数对外观做太多的改变。

HBRUSH C按钮控件自绘Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);switch (pWnd->GetDlgCtrlID()){case IDC_BUTTON1:{pDC->SetBkMode(TRANSPARENT);pDC->SetBkColor(RGB(255, 0, 255));pDC->SetTextColor(RGB(255, 0, 0));static CBrush brush(RGB(255, 0, 255));return brush;}break;return hbr;}
}

欲设置按钮的背景为紫色,文字为红色,但是通过OnCtlColor()函数并不能实现预期的结果
在这里插入图片描述
为了能够修改Button控件字体、字体大小、背景色、背景图片,需要对Button控件进行自绘。

设置Button控件的自绘属性

方法一:在资源视图中将所有者描述设置为true
在这里插入图片描述
方法二:在OnInitDialog函数里给按钮添加BS_OWNERDRAW风格

GetDlgItem(IDC_BUTTON1)->ModifyStyle(0, BS_OWNERDRAW);

建立一个以CButton为基类的派生类并重载DrawItem()函数

在这里插入图片描述
通过类向导添加DrawItem()函数
在这里插入图片描述

为按钮添加关联变量

变量类型将CButton改成MyButton
在这里插入图片描述

MyButton类的设计

#pragma once
#include <afxwin.h>
class MyButton :public CButton
{public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
public://三种颜色分别为文字,Button Down的背景颜色,Button Up的背景颜色COLORREF m_TextColor, m_DownColor, m_UpColor;//Button Down的背景颜色,Button Up的背景颜色标志位bool bDownColor, bUpColor;//设置文字大小int nWordSize = 100;UINT    imageID;//记录图片ID
public://设置Button Down的背景颜色void SetDownColor(COLORREF color);//设置Button Up的背景颜色void SetUpColor(COLORREF color);//设置背景图片void SetBkImage(UINT ID);//设置文字大小,默认为10号void SetWordSize(int wordsize);//设置文字颜色默认为黑色void SetWordColor(COLORREF wordColor);// 文字处理void SetWord(CRect rect, CDC* pDc, int size);//绘制背景图片void DrawBkImage(CRect rect, CDC* pDc, UINT ID);};
#include "pch.h"
#include "MyButton.h"void MyButton::SetDownColor(COLORREF color)
{m_DownColor = color;bDownColor = TRUE;//颜色是否设置标志位
}
void MyButton::SetUpColor(COLORREF color)
{m_UpColor = color;bUpColor = TRUE;
}
void MyButton::SetBkImage(UINT ID)
{imageID = ID;
}
void MyButton::SetWordSize(int wordsize)
{nWordSize = wordsize;
}
void MyButton::SetWordColor(COLORREF wordColor = RGB(255, 255, 255))
{m_TextColor = wordColor;
}
void MyButton::DrawBkImage(CRect rect, CDC* pDc, UINT ID)
{CDC   dcBmp;             //定义并创建一个内存设备环境dcBmp.CreateCompatibleDC(pDc);             //创建兼容性DCCBitmap   bmpBackground;bmpBackground.LoadBitmap(ID);    //载入资源中图片BITMAP   m_bitmap;                         //图片变量               bmpBackground.GetBitmap(&m_bitmap);       //将图片载入位图中//将位图选入临时内存设备环境CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);//调用函数显示图片StretchBlt显示形状可变pDc->SetStretchBltMode(HALFTONE);pDc->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
}
// 文字处理
void MyButton::SetWord(CRect rect, CDC* pDc, int nWordSize)
{CString str;GetWindowText(str);//获取文字CFont font;font.CreatePointFont(nWordSize, L"仿宋");//设置控件文字大小与字体pDc->SelectObject(&font);pDc->SetTextColor(m_TextColor);//设置文字颜色// dc.SetBkColor(RGB(255, 0, 0));//设置文字背景颜色pDc->SetBkMode(TRANSPARENT);//设置文字背景透明pDc->DrawText(str, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_TABSTOP);//绘制文字
}
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{CDC dc;dc.Attach(lpDIS->hDC);//得到绘制的设备环境CDCdc.SelectStockObject(NULL_BRUSH);//按钮为默认颜色dc.Rectangle(&lpDIS->rcItem);//画出按钮框CString str;CRect rect = lpDIS->rcItem;GetClientRect(&rect);//得到客户端坐标 //ScreenToClient();将屏幕坐标转换为客户端坐标//加载背景图片,判断是否加载背景图片,没有则使用默认背景if (imageID != 0) DrawBkImage(rect, &dc, imageID);//按钮按下时改变背景色if (lpDIS->itemState & ODS_SELECTED){if (bDownColor){CBrush brush(m_DownColor);dc.FillRect(&(lpDIS->rcItem), &brush);//利用画刷brush,填充矩形框}}else//当按钮不操作或者弹起时改变背景色{if (bUpColor){CBrush brush(m_UpColor);dc.FillRect(&(lpDIS->rcItem), &brush);//利用画刷brush,填充矩形框}}//文字处理(绘制文字)SetWord(rect, &dc, nWordSize);dc.Detach();
}

效果

/*放在OnInitDialog函数或OnPaint函数里*/m_button1.SetUpColor(RGB(255, 0, 0));
m_button1.SetDownColor(RGB(0, 0, 255));

在这里插入图片描述
如果要在按钮上显示图片,不要设置按钮按下和弹起的颜色,这会覆盖图片

void C按钮控件自绘Dlg::OnPaint()
{CPaintDC dc(this);CRect rect;GetDlgItem(IDC_BUTTON1)->GetWindowRect(&rect);//获取控件的屏幕坐标ScreenToClient(&rect);//转换为窗口的的客户区坐标m_button1.SetBkImage(IDB_BITMAP1);m_button1.DrawBkImage(rect, &dc, IDB_BITMAP1); 
}

在这里插入图片描述
这个时候点击按钮并没有什么变化(这里指视觉上的变化,消息还是有的)
那么可以在DrawItem()函数里添加一些功能,比如按钮按下的时候绘制边框,弹起时销毁边框

if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))){//设置按钮边框颜色为蓝色COLORREF color = RGB(0, 0, 255);CBrush brush(color);dc.FrameRect(&(lpDIS->rcItem), &brush);//用画刷brush,填充矩形边框}//控制的选中状态结束,去掉边框
if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT)){CBrush brush(m_UpColor);dc.FrameRect(&lpDIS->rcItem, &brush);}

LPDRAWITEMSTRUCT结构体
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/131657.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dinky上路之旅

1、部署flink集群 1.1、flink-conf.yaml cat > flink-conf.yaml << EOF jobmanager.rpc.address: boshi-146 jobmanager.rpc.port: 6123 jobmanager.bind-host: 0.0.0.0 jobmanager.memory.process.size: 1600m taskmanager.bind-host: 0.0.0.0 # 修改为本机ip tas…

芯科蓝牙BG27开发笔记1-新建示例工程

此笔记的必要性 芯科的官方资料很丰富&#xff0c;并且ssv5中能方便索引到所需文档&#xff0c;不过大而全的问题就是找不到合适的切入点&#xff0c;更不会有本地化比较好的中文的系统的教程了。往往看到一个starting guide&#xff0c;会延伸其他starting guide&#xff0c;…

自动化控制系统的设计重点是什么?

要实现对选择性激光烧结系统预热温度的控制&#xff0c;需要找到合理的控制对象模型&#xff0c;但选择性激光烧结设备的预热温度场是一个复杂的非线性系统&#xff0c;很难找到合理的控制对象模型来实现预热温度场的温度控制。模糊控制不需要具体的控制模型&#xff0c;预热温…

如何修改jupyter notebook默认打开路径

1、用jupyter notebook在其他位置打开自己的ipython项目&#xff1a; jupyter notebook是一个很好用的工具&#xff0c;可以保存运行结果&#xff0c;还可以给项目添加很多可视化操作与介绍文字。安装anaconda后&#xff0c;jupyter notebook就会自动安装&#xff0c;点开它会…

The specified module could not be found.

新电脑运行项目的时候出现了某个包找不到的问题 \\?\D:\guanwnag\cloudquery-website\node_modules\.pnpm\nxnx-win32-x64-msvc16.5.3\node_modules\nx\nx-win32-x64-msvc\nx.win32-x64-msvc.node 引入的路径就感觉有问题 去github上查找原因&#xff0c;发现是没安装 Micro…

基于SSM的应急资源管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

TypeScript类型推断

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 类型推断 1. 基础类型推断 #2. 最佳公共类型推断 3. 上下文类型推断 4. 类型断言 #5. 类型推断和泛型 总结 类…

第1章_瑞萨MCU零基础入门系列教程之单片机程序的设计模式

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

从零开始:PostgreSQL入门完全指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析 1 linux原始设备驱动信息1.1 设备树节点信息1.2 linux设备驱动1.3 makefile1.4 Kconfig1.5 对应的defconfig文件 2 修改之后的linux设备驱动2.1 修改之后的设备树节点信息2.2 原始test_fw.c出现的问题以及原因分析…

探访天府蜂巢成都直播基地,全成都前十的直播产业供应链都在这!

随着新一轮科技革命和产业变革深入发展&#xff0c;数字化转型已经成为大势所趋。成都直播基地作为数字经济创新发展的前沿和焦点&#xff0c;为产业转型升级和数字经济发展提供核心驱动力。 “直播”新业态新模式的兴起&#xff0c;显示出强大的潜力和活力&#xff0c;树莓集团…

直播平台源码开发搭建APP的DASH协议:流媒体技术其中一环

在直播平台源码APP中&#xff0c;有着许许多多、多种多样的功能&#xff0c;比如短视频功能&#xff0c;帮助我们去获取信息&#xff0c;看到全世界用户身边发生的事情或是他们的生活&#xff1b;又比如直播功能&#xff0c;为用户提供了实时的娱乐享受&#xff0c;还让一些用户…

创建java文件 自动添加作者、时间等信息 – IDEA 技巧

2023 09 亲测 文章目录 效果修改位置配置信息 效果 每次创建文件的时候&#xff0c;自动加上作者、时间等信息 修改位置 打开&#xff1a;File —> Settings —> Editor —> File and Code Templates —> includes —> FileHeader 配置信息 /*** author : Java…

图论第二天|岛屿数量.深搜版、岛屿数量.广搜版、岛屿的最大面积、1020.飞地的数量

岛屿数量.深搜版 文档讲解 &#xff1a;代码随想录 - 岛屿数量.深搜版 状态&#xff1a;开始学习。 本题是dfs模板题 本题代码&#xff1a; class Solution { private:int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向void dfs(vector<vector<char>>&…

interview3-微服务与MQ

一、SpringCloud篇 &#xff08;1&#xff09;服务注册 常见的注册中心&#xff1a;eureka、nacos、zookeeper eureka做服务注册中心&#xff1a; 服务注册&#xff1a;服务提供者需要把自己的信息注册到eureka&#xff0c;由eureka来保存这些信息&#xff0c;比如服务名称、…

diskGenius专业版使用:windows系统下加载ext4 linux系统分区并备份还原资源(文件的拷贝进、出)

前言 EXT4是第四代扩展文件系统&#xff08;英语&#xff1a;Fourth extended filesystem&#xff0c;缩写为 ext4&#xff09;是Linux系统下的日志文件系统&#xff0c;是ext3文件系统的后继版本。 所以我们在windows系统下是不能识别的&#xff0c;也不能对其写入、拷贝出文…

FD1257H 带有嵌入式霍尔传感器的智能电机驱动器芯片

FD1257H 带有嵌入式霍尔传感器的智能电机驱动器芯片 特征 电机驱动器与集成霍尔传感器 锁关闭保护和自动重启功能 精确的磁开关阈值 “软开关“相位切换技术&#xff0c;以减少振动和声噪声 热关闭保护 可在SIP-4L包 为12V系统 一般说明 FD1257H是一个嵌入式霍尔传感器的单线圈…

fastjson漏洞批量检测工具

JsonExp 简介 版本&#xff1a;1.3.5 1. 根据现有payload&#xff0c;检测目标是否存在fastjson或jackson漏洞&#xff08;工具仅用于检测漏洞&#xff09;2. 若存在漏洞&#xff0c;可根据对应payload进行后渗透利用3. 若出现新的漏洞时&#xff0c;可将最新的payload新增至…

jeesite自定义数据字典,自定义字典表,自带树选择数据源(保姆级图文教程)

文章目录 前言一、框架自带树字典表如何使用二、自定义表作为字典表1. 下拉选项使用自建表作为字典表。实际效果框架示例实际开发代码2. 结构树选择使用自建表作为字典表。效果展示实际开发代码总结前言 项目开发中字典表如果不满足实际需求,比如使用自己的表作为字典,系统自…

Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory

文章目录 参考博客&#xff1a; Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory 首先在此对这位博主表示感谢。 运行bash脚本会出现两个文件&#xff0c;1037.err和1037.out。 1037.err的文件内容如下&#xff1a; /data/home/user12/.lsbat…