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

2024-06-12 14:48

本文主要是介绍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结构对应的那部分代码,我们稍作修改:


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

     

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

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


这篇关于Win32窗体应用程序如何添加资源文件?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054517

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

Win32函数调用约定(Calling Convention)

平常我们在C#中使用DllImportAttribute引入函数时,不指明函数调用约定(CallingConvention)这个参数,也可以正常调用。如FindWindow函数 [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]public static extern IntPtr FindWindow

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

Java Web应用程序的推荐目录结构

以前没有用过maven管理过项目的依赖,最后使用上了maven,发现通过不能方式建立出来的web应用程序目录结构基本都不一样,既然每次都要到网上搜索如何建立maven管理的Web应用程序,不如自己找百度谷歌一下。 找了半天 ,感觉比较好的maven管理的web应用程序目录结构是这个: ├── pom.xml└── src├── main│ ├── java│ │ └── myg

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

caffe训练openpose相关资源

CPMTransformationParameter参数解析: https://www.jianshu.com/p/063a2159f0f2 genLMDB.py: https://www.jianshu.com/p/1cae32cbd36d OpenPose 参数说明: https://blog.csdn.net/zziahgf/article/details/84668319 openp

ubuntu内存资源使用情况监视

此处分享一个可以查看ubuntu系统中资源使用情况的指令,只需要在终端中输入一下这条指令即可: gnome-system-monitor

一个C++程序运行,从点击运行到控制台打印文本,电脑硬件的资源是如何调动的

当点击运行一个 C++ 程序并看到控制台输出文本时,计算机硬件和操作系统之间协同工作,完成了多个步骤。这些步骤涉及 CPU、内存、存储设备、操作系统和输入输出设备的共同作用。下面是一个详细的过程描述: 1. 程序加载 启动:当你点击运行一个可执行文件时,操作系统(通常是 Windows、Linux 或 macOS)的文件系统管理器识别请求,并启动加载程序。读取可执行文件:加载程序将可执行文件从