Win32窗体应用程序如何添加资源文件?


Win32窗体应用程序如何添加资源文件?


     上一篇文章介绍了:如何创建一个最简单的Windows窗体应用程序。

     按照上一篇文章的介绍,我们的HelloApp项目对应如下的窗体应用程序:

     

     这一篇文章中,我们将在这个程序的基础上,介绍如何在项目中添加资源文件,完成对程序图标的修改。

     最终期望得到的效果为:

     

     明确了目标,下面我们开始正式介绍。


     程序是如何加载图片的?

     我们往项目中添加图片/图标/光标等资源文件的目的就是在程序中将其显示出来。为了更好的理解如何在项目中添加资源文件,我们先来看看在下面的两个程序中是如何加载资源图片的。

     1.HelloApp

     还从HelloApp项目入手,回忆下我们是如何设置程序窗体的图标的?

     上文我们介绍过,WinMain函数是程序的入口,在此函数中我们要定义窗口类结构WNDCLASSEX。而此结构包含关于窗口的信息,例如应用程序图标、窗口背景色、标题栏中显示的名称、窗口过程函数的名称等。

     我们可以在WinMain函数中找到设定应用程序图标的这行代码:

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

     可以看到,LoadIcon函数用于加载图标,代码中指定使用IDI_APPLICATION作为应用程序图标,而通过观察定义我们会发现IDI_APPLICATION仅仅对应一个整形的数,它是如何与一个图标对应上的呢?我们再看一个例子

     2.象棋小巫师

     象棋小巫师是一个开源的象棋AI程序,它最早版本的窗体界面如下:


     显然这个象棋程序的界面是通过已有的图片资源绘制上去的。

     如果去追溯它的源码可以发现,它是通过类似于下面这行代码来将资源中的图片加载到程序中的:

LoadImage(Xqwl.hInst, MAKEINTRESOURCE(IDB_BOARD), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_SHARED);

     其中IDB_BOARD标识的是整个棋盘对应的图片,通过查找定义可以看到。IDB_BOARD被定义在名为resource.h的头文件中,截图如下:

     

     可以看到IDB_BOARD仍然仅仅对应了一个整形的数,它是如何与图片关联上的呢?

     在解决方案资源管理器中,我发现资源文件下有一个拓展名为.rc的文件:

     

     它很有可能就是我们要找的答案,查看其代码:

     

     我们欣喜的在拓展名为.rc的文件中发现了IDB_BOARD这个变量,并且发现了疑似文件路径的字符串。

     我们按照这个路径线索去寻找,发现正是我们想要的那张图片:

     

     通过我们一系列不严谨的求知探索,我们发现了资源图片使用原理:

     程序通过一个resource.h文件和项目的.rc文件配合来完成图片资源的加载。

     程序员只需向相应的函数(例如LoadImage)提供resource.h中定义的整形变量(例如IDB_BOARD

     整形变量IDB_BOARD具体对应的资源文件是什么是通过.rc文件控制的。


     如何添加资源文件?

     明白了Win32应用程序资源文件的使用原理,我们来看看如何添加资源文件?

     也就是我们如何来生成resource.h文件和项目的.rc文件

     我们打开上一文介绍的HelloApp项目(我仅以它为例说明,你可选择在任意项目上完成下面的操作)

     1.准备资源文件

     为了完成我们的测试你需要在项目中新建一个用于存放资源的文件夹,随便找几张图片放进去即可。

     

     可以看到,我在RES文件夹中准备了一些图片、视频和图标文件。

     

     2.添加资源

     在解决方案资源管理器中,右键资源文件->单击添加->单击资源

     

     完成后会跳出如下的界面     

     

     虽然什么都还没做,此时你已经可以看到,在解决方案资源管理器中,我们的IDE,也就是VS已经帮我们生成了resource.h和HelloApp.rc文件,尽管现在还没有什么实质性的内容。

     选择图标选项Icon,然后单击导入,将我们在RES文件夹中准备的图标文件导入。

     成功后,我们可以分别在resource.h和HelloApp.rc中看到:

        


     可以看到,VS已经帮我们生成了相应的代码,我们可以使用整形变量IDI_ICON1来标识我们选择的对应图标了。

     如果我们想要自己命名呢?只需直接修改resource.h和HelloApp.rc相应位置,只要这两个文件能够对应即可。

     我将变量名修改为了IDI_XQ。

     随后,找到WndMain函数中用于描述窗体信息的WNDCLASSEX结构对应的那部分代码,我们稍作修改:


     我们重新指定了应用程序的图标,重新生成项目,就得到了我们期望的结果:

     

     到此就介绍完毕了。如果你想向资源文件中添加图片/光标文件等,方法是完全类似的。

     希望阅读本文能让你有所收获,本文中错误的地方还望指正。


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

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

相关文章

通过数组和枚举简化GPIO操作编码

在工作中,经常遇到大量使用GPIO作为数字量输入输出来控制设备或采集状态,每次定义操作不同的GPIO针脚既麻烦又容易出错,于是就想要简化操作过程。对于数字量输入来说就是采集对应针脚的状态;而输出则是根…

【论文党福利】如何提取图像中的数据

【论文党福利】如何提取图像中的数据 从事科研的老师和同学们在撰写论文时,经常需要将文献中的曲线与自己的结果进行对比,为获取原始数据,最靠谱的方法当然是找原作者要。如果没有要到呢?本文将成为论文党的福利,为你…

添加串口和虚拟终端输出帮助调试

在使用IAR开发STM32项目时,使用串口或者是虚拟终端来输出我们想看的信息是一个非常好而且简便的方式。 首先来看看串口怎么实现信息输出。简单来说串口输出信息就是将标准输出重定向到串口,在上位机的超级终端或者串口助手等工…

1.1股票数据预处理练习

第一阶段、一个简单策略入门量化投资 1.1股票数据预处理练习 无论我们要对股票市场进行何种探索,在开始前,研究如何获取数据,并进行对应的预处理都是必要的。 本节以美股为例,进行股票数据预处理的练习。正文如下: …

1-2 移动均线交叉策略1

第一阶段、一个简单策略入门量化投资 1-2 移动均线交叉策略1 第一阶段一个简单策略入门量化投资1-2 移动均线交叉策略1前言获取数据移动均线交叉策略数据可视化绘制折线图绘制K线图绘制移动均线 移动均线交叉策略回测什么是回测回溯买卖信号计算收益 未完待续完整代码 前言 …

STM32F412应用开发笔记之一:初识NUCLEO-F412ZG

今天终于收到了期待已久的NUCLEO-F412ZG,感谢电子发烧友论坛! 近几年来基本都是在STM32平台上做一些设计开发工作。STM32F103、STM32F107、STM32F429等都应用过,但却从没有申请过试用。没想到这次申请居然能被选中&a…

STM32F412应用开发笔记之二:基本GPIO控制

NUCLEO-F412ZG板子上的元器件并没有完全焊接,除去ST-LINK部分和电源部分后,还有用一个USB主机接口,三个LED灯和两个按钮,不过很多功能引脚都已经引到了插针。查看原理图可发现,由原理图模块的…

1-3移动均线交叉策略2

第一阶段、一个简单策略入门量化投资 1-3移动均线交叉策略2 上一篇文章1-2 移动均线交叉策略1中我们最后提到: 如果我们从第一天买入股票,一直持有股票,最后一天卖出,获得的收益是每股124.02美元,收益率为412% 如果…

1-4移动均线交叉策略3

第一阶段、一个简单策略入门量化投资 1-4移动均线交叉策略3 上一文1-3移动均线交叉策略2中,我们得到的结果是令人失望的。但我们的探索还要继续。 我们知道,使用投资组合的方式进行分散投资是降低风险的好办法。尽管移动均线交叉策略的表现并不理想&a…

STM32学习及应用笔记一:SysTick定时器学习及应用

 这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过。最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下。 1、SysTick究竟是什么? 关于SysT…

使用Atom快速打造好用的Markdown编辑器

使用Atom快速打造好用的Markdown编辑器 Atom当前主流的跨平台的三大编辑器(Atom,sublime,vscode)之一 今天尝试了使用Atom来打造Markdown编辑器,快速上手且易用,墙裂推荐! 下面直接进入正题,一步步介绍如何使用Atom快速打造好用…

PID控制器开发笔记之一:PID算法原理及基本实现

 在自动控制中,PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景。…

十分钟能学会的简单python爬虫

简单爬虫三步走,So easy~ 本文介绍一个使用python实现爬虫的超简单方法,精通爬虫挺难,但学会实现一个能满足简单需求的爬虫,只需10分钟,往下读吧~ 该方法不能用于带有反爬机制的页面,但对于我这样的非专业…

PID控制器开发笔记之二:积分分离PID控制器的实现

前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器。但这个实现只是最基本的实现,并没有考虑任何的干扰情况。在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与改进。这一节我们首…

利用python实现短信和电话提醒功能

有时候,我们需要程序帮我们自动检测某些事件的发生 这个需求是广泛存在的 因此,这里整理了利用python实现短信和电话提醒功能的方法 主要需要完成以下4个步骤: - 安装核心库:twilio - 注册账号及配置 - 发送短信示例 - 电话…

PID控制器开发笔记之三:抗积分饱和PID控制器的实现

积分作用的引入是为了消除系统的静差,提高控制精度。但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能。抗积分饱和就是用以解决这一问题的方法之一。这一节我们就来实现抗积分饱和的PID算法。 1、抗积…

Git 忽略编译后文件

当我们第一次对某个Git仓库中的项目进行编译后,未追踪的文件通常有两类。 一类是项目新增但还未提交的文件, 另一类是像 .pyc、.obj、.exe 等编译后的二进制文件。 显然前者应该出现在 git status 的输出中,而后者会让我们困惑究竟发生了什…

如何获取STM32 MCU的唯一ID

前段时间由于应用需要对产品授权进行限制,所以研究了一下有关STM32 MCU的唯一ID的资料,并最终利用它实现了我们的目标。 1、基本描述 在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面&#x…

SHA256算法原理详解

1. SHA256简介 SHA256是SHA-2下细分出的一种算法 SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一&…

学习笔记:区块链概念入门

本文是100天区块链学习计划的第二篇学习笔记,其实就是按照阮一峰的网络日志-区块链入门教程的讲解进行的简单梳理。也是时间有点紧张的原因,相比于上一篇SHA256算法原理详解,个人感觉质量和原创程度明显下降。待对区块链有了更深的理解后&…