贴图法美化Button按钮

贴图法美化Button按钮

项目是在下面这篇文章里的基础上进行美化的:MFC实现INI配置文件的读取

1. 初始效果

image

2.最终效果

image

3. 增加 CImgButton 类

image

1.1 ImgButton.h 头文件

#pragma once
// CImgButtonclass CImgButton : public CBitmapButton
{DECLARE_DYNAMIC(CImgButton)
public:CImgButton();virtual ~CImgButton();protected:DECLARE_MESSAGE_MAP()
public:COLORREF TextColor; void SetTextColor(COLORREF crColor); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};

1.2 ImgButton.cpp 文件

// ImgButton.cpp : 实现文件
#include "stdafx.h"
#include "READINI.h"
#include "ImgButton.h"
// CImgButton
IMPLEMENT_DYNAMIC(CImgButton, CBitmapButton)
CImgButton::CImgButton()
{
}CImgButton::~CImgButton()
{
}BEGIN_MESSAGE_MAP(CImgButton, CBitmapButton)
END_MESSAGE_MAP()// CImgButton 消息处理程序
void CImgButton::SetTextColor(COLORREF crColor) 
{ TextColor = crColor; 
} 
void CImgButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{// 获取按钮的矩形区域CRect rect = lpDrawItemStruct->rcItem;// 从 lpDrawItemStruct 中获取设备上下文指针CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);// 保存当前设备上下文状态int nSaveDC = pDC->SaveDC();// 获取按钮的状态UINT state = lpDrawItemStruct->itemState;// 定义一个字符数组来存储按钮文本TCHAR strText[MAX_PATH + 1];// 获取按钮的文本内容::GetWindowText(m_hWnd, strText, MAX_PATH);// 设置按钮背景颜色pDC->FillSolidRect(&rect, ::GetSysColor(COLOR_3DFACE));// 获取按钮位图BITMAP bmp;m_bitmap.GetBitmap(&bmp);// 创建内存DC,并选择位图CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);// 调整位图大小以适应按钮大小pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);// 恢复原位图memDC.SelectObject(pOldBitmap);// 设置文本颜色pDC->SetTextColor(TextColor);// 如果按钮有文本if (strText != NULL){// 获取按钮字体CFont *hFont = GetFont();// 选择按钮字体,并保存旧字体CFont *hOldFont = pDC->SelectObject(hFont);// 计算文本的宽度和高度CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));// 计算文本绘制位置,使其居中CPoint pt(rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);// 如果按钮被按下,偏移绘制位置if (state & ODS_SELECTED){pt.Offset(1, 1);}// 设置背景模式为透明int nMode = pDC->SetBkMode(TRANSPARENT);// 如果按钮被禁用,绘制禁用状态的文本if (state & ODS_DISABLED){pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);}else // 否则,绘制正常状态的文本{pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);}// 恢复旧字体pDC->SelectObject(hOldFont);// 恢复背景模式pDC->SetBkMode(nMode);}// 恢复设备上下文状态pDC->RestoreDC(nSaveDC);
}

4. 修改按钮的 Owner Draw 属性

image

5. 在资源视图中增加位图

在项目文件中新建一个文件存放位图资源,名字随意。笔者这里是 Extern

image

image

image

导入刚刚存放位图资源的文件夹,因为这里图片资源少,所以位图名字改不改都行

image

6. 在 READINIDlg.h 增加声明

// READINIDlg.h : 头文件
。。。。。。
public:CImgButton m_BitmapButton;CImgButton m_SelectButton, m_FreshButton, m_ShowButton, m_GetButton, m_WriteButton;

7. 修改READINIDlg.cpp文件

每一个 Button 控件对应一个上面声明的成员函数

void CREADINIDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);。。。。。。DDX_Control(pDX, IDC_SELECT_FILE_BUTTON, m_SelectButton);DDX_Control(pDX, IDC_FLUSH_BUTTON, m_FreshButton);DDX_Control(pDX, IDC_SHOW_INI_BUTTON, m_ShowButton);DDX_Control(pDX, IDC_GET_BUTTON, m_GetButton);DDX_Control(pDX, IDC_WRITE_BUTTON, m_WriteButton);。。。。。。
}
BOOL CREADINIDlg::OnInitDialog()
{CDialog::OnInitDialog();。。。。。。// TODO: 在此添加额外的初始化代码m_SelectButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_SelectButton.SetTextColor(RGB(0,0,0));m_FreshButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_FreshButton.SetTextColor(RGB(0,0,0));m_ShowButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_ShowButton.SetTextColor(RGB(0,0,0));m_GetButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_GetButton.SetTextColor(RGB(0,0,0));m_WriteButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_WriteButton.SetTextColor(RGB(0,0,0));return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

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

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

相关文章

游戏本地化以拓展海外市场

Logrus IT Korea的总监元庆燕(KyoungYeon Won)发表了一场关于“游戏本地化”的讲座,讲述了独立游戏开发者如何在梦想拓展海外市场的过程中,正确地本地化他们的游戏以满足国际市场的期望,以及实现这一重要任务的过程。 …

NFS环境部署

服务端 1.是否安装过 rpm -qa nfs-utils rpcbbind 2.安装 创建共享文件夹更改文件夹用户和组给文件夹赋权限 yum install -y nfs-utils rpcbbind # mkdir -p /mnt/data/localnfs/ # chown -R nfsnobody:nfsnobody /mnt/data/localnfs/ # chmod 766 /mnt/data/localnfs/ 3.修改…

注解详解系列 - @ResponseStatus

注解简介 在今天的每日一注解中,我们将探讨ResponseStatus注解。ResponseStatus是Spring框架中的一个注解,用于为控制器方法指定HTTP响应状态码和理由短语。 注解定义 ResponseStatus注解用于标记控制器方法或异常类,以指示HTTP响应的状态码…

webpack 压缩图片

压缩前: 压缩后: 压缩后基本上是压缩了70-80%左右 1.依赖版本及配置 "imagemin-webpack-plugin": "^2.4.2", "imagemin-mozjpeg": "^7.0.0", "imagemin-pngquant": "^5.0.1", "webpa…

【项目工具】相关工具整理

陆续整理... 在线画饼图等:https://www.liuchengtu.com/chart/histogram/ - 迅捷画图 在线话流程图:https://www.processon.com/diagrams - ProcessOn 在线ps编辑图:https://www.uupoop.com/ - 在线PS软件

JDK为什么要配置Paht和Classpath

目录 一、Path环境变量 二、Classpath环境变量 三、总结 在Java中,JDK(Java Development Kit)的配置是开发Java应用程序的重要步骤之一。配置JDK主要包括设置两个关键的环境变量:Path和Classpath。这两个环境变量在Java开发和运…

定个小目标之刷LeetCode热题(26)

这道题属于一道简单题&#xff0c;可以使用辅助栈法&#xff0c;代码如下所示 class Solution {public boolean isValid(String s) {if (s.isEmpty())return false;// 创建字符栈Stack<Character> stack new Stack<Character>();// 遍历字符串数组for (char c : …

探索Java异常处理的奥秘:源码解析与高级实践

1. 引言 在Java编程的广阔天地中,异常处理是确保程序健壮性、稳定性和可维护性的重要基石。对于Java工程师而言,深入理解Java异常处理的机制,并能够在实践中灵活运用,是迈向卓越的重要一步。 2. 基本概念 在Java中,异常(Exception)是程序执行期间出现的不正常或错误情况…

项目3:从0开始的RPC框架(扩展版)-2

六. 自定义协议 1. 需求分析 在目前的RPC框架中&#xff0c;采用Vert.x的HttpServer作为服务提供者的Web服务器&#xff0c;底层使用HTTP协议进行网络传输。但HTTP协议只是RPC框架网络传输的一种可选方式&#xff0c;还有其它更好的选择。 RPC框架注重性能&#xff0c;但HTT…

基于组件的架构:现代软件开发的基石

目录 前言1. 基于组件的架构概述1.1 什么是组件&#xff1f;1.2 组件的分类 2. 基于组件的架构的优势2.1 提高代码的可重用性2.2 增强系统的灵活性2.3 简化维护和升级2.4 促进团队协作 3. 实现基于组件的架构3.1 识别和定义组件3.2 设计组件接口3.3 组件的开发和测试3.4 组件的…

【启明智显产品分享】工业级HMI芯片——Model3,不止是速度,USB\CAN\8路串口

一、引言 Model3作为一款工业级HMI芯片&#xff0c;其性能卓越且功能全面。本文将从多个角度深入介绍Model3芯片&#xff0c;以展示其不仅仅是速度的代表。 二、Model3核心特性介绍 Model3工业级跨界MCU是一款国产自主的基于RISC-V架构的高性能芯片&#xff0c;内置平头哥E…

作为一名车载测试工程师,核心能力是什么?

核心能力 汽车系统知识&#xff1a;作为车载测试工程师&#xff0c;首先需要具备深入的汽车系统知识&#xff0c;包括动力系统、传动系统、底盘系统、车身系统等各个方面的知识。只有对汽车系统有足够的了解&#xff0c;才能进行有效的测试和验证工作。 测试方法和工具&#xf…

【文献及模型、制图分享】“一带一路”沿线国家水资源禀赋及开发利用分析

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

jenkins中配置参数化,并在python脚本接收参数实现参数化执行

在公司内进行Monkey测试脚本集成jenkins时&#xff0c;因为需要指定公司内不同的app进行测试。那么可以有两种方法解决该问题&#xff0c;要么创建多个脚本文件&#xff0c;多个jenkins jobs&#xff0c;进行构建。要么可以在配置job时通过传参数的方式&#xff0c;在python脚本…

Vue与TypeScript的配合:如何在Vue项目中使用TypeScript,利用静态类型提高代码的可维护性

环境搭建: 在你的 Vue 项目中使用 TypeScript,使你的代码具有静态类型检查、IDE 的类型提示等有益的功能。以下是搭建 Vue 和 TypeScript 的开发环境的步骤: 创建一个项目 使用 Vue CLI 创建一个新的Vue项目是最简单的方法: vue create my-project 在出现的提示中,选择…

算法基础精选题单 动态规划(dp)(区间dp)(个人题解)

目录 前言&#xff1a; 正文&#xff1a; 题单&#xff1a;【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) NC50493 石子合并&#xff1a; NC50500 凸多边形的划分&#xff1a; NC235246 田忌赛马&#xff1a…

【机器学习】klearn基础教程

scikit-learn&#xff08;通常缩写为sklearn&#xff09;是一个用于Python编程语言的强大机器学习库。它提供了各种分类、回归、聚类算法&#xff0c;以及数据预处理、降维和模型评估的工具。以下是sklearn的基础教程&#xff0c;帮助你开始使用它&#xff1a; 1. 安装scikit-…

神经网络的卷积操作中不同的卷积核和不同的填充获得同样的输出

神经网络的卷积操作中不同的卷积核和不同的填充获得同样的输出 nn.Conv2d(in_channels,out_channels,kernel size, stridel, padding-0,dilationl,groupsl,biasTrue,padding_modezeros,deviceNone, dtypeNone)nn.Conv2d卷积输人数据的格式是(batch_size,C&#xff0c;H&#x…

排序算法、堆排序、大顶堆、小顶堆、手写快排-215. 数组中的第K个最大元素、2336. 无限集中的最小数字

目录 215. 数组中的第K个最大元素 题目链接及描述 题目分析 堆排序分析 堆排序代码编写 快排分析 快排代码编写 2336、无限集中的最小数字 题目链接及描述 题目分析 代码编写 215. 数组中的第K个最大元素 题目链接及描述 215. 数组中的第K个最大元素 - 力扣&#…

python函数——基础

一、函数基础 函数体&#xff08;功能代码块&#xff09; 函数是执行特定任务的代码块&#xff0c;通过调用函数名并传递参数&#xff08;如果有的话&#xff09;来执行这些任务。 函数的参数 参数列表由一系列参数组成&#xff0c;使用逗号分隔。实参&#xff1a;调用函数时…