LoadIcon() --加载一个图标资源

本文详细介绍了LoadIcon()函数的使用方法,包括如何加载系统预定义图标和自定义图标资源。通过实例展示了如何在窗口类中设置图标资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LoadIcon() 函数原型如下:
?
1
2
3
4
HICON LoadIcon(
   HINSTANCE hInstance,
   LPCTSTR lpIconName
);

该函数从与 hInstance 模块相关联的可执行文件中装入lpIconName指定的图标资源,仅当图标资源还没有被装入时该函数才执行装入操作,否则只获取装入的资源句柄。

比如,在对窗口类初始化时,我们可以如下使用:
?
1
2
WNDCLASSEX mywcex;
mywcex.hIcon = LoadIcon(NULL,IDI_ERROR);

上面代码中,我们将标题栏上的图标定义为 IDI_ASTERISK ,编译运行后会看到标题栏上的图标为:

注意,上面函数中第一个参数为 NULL,此时使用的是系统预定义的图标,其它预定义选项可参考 MSDN,否则使用自定义的图标资源。还有一种选择图标的做法是,即使用  MAKEINTRESOURCE 宏对一个十六位数的资源标识符(高 8 位为0,低 8 位为图标资源ID)进行转换。使用该宏的时候,我们往往使用 Visual Studio 为我们自动产生资源头文件 resource.h 和 资源文件 OurProject.rc 。.rc 文件是个文本文件,我们可以在记事本里编辑它们,但一般不会直接去这么做。新建图标资源的操作结果会写到该文件中。比如,可以通过 VS 里的“文件”--> “新建” --> “文件”--> “图标文件(.ico)” 来新添加一个图标,接着可以编辑该图标,最后保存。如果要添加该新建的图标,可以在“解决方案资源管理器”窗口底下的“资源文件”文件夹下双击打开 "OurProject.rc“ 文件,接着右键点击“Icon “文件夹图标,在弹出的菜单中选择“添加资源”,在弹出的对话框中,选择“Icon”,然后点击右边的“导入”按钮,将之前编辑好的图标资源添加进来。如下图所示:

完后,我们可以看到左边的“资源视图”窗口里的 "Icon" 下面多了一项“IDI_ICON1”,这个就是我们自定义的图标。如下图所示:

在保存好上面的工作后,打开 resource.h 就可以看到多了一项定义:
#define IDI_ICON1                       135

好了,现在可以用这个新建的自定义图标了,现在修改源码文件,正是使用 MAKEINTRESOURCE  这个宏来进行转换,比如:
mywcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

再重新生成一下可执行文件,可以看到:


最后还需要注意的是,在窗口类中还有一个成员 hIconSm 。这是一个小图标句柄,如果该项为空,那么系统就会使用 hIcon 成员所指定的图标,并用合适的尺寸来使用它 --- 上面的步骤就是设置了 hIconSm 为空,而使用了 hIcon 所指示的图标。
封装一个图标加载组件通常是在Web或应用开发中为了管理图片资源和优化用户体验的一种常见做法。这个组件通常会负责以下几个关键功能: 1. **缓存处理**:通过将图标数据存储到内存或本地,避免频繁地从网络请求,提高性能。 2. **错误处理**:提供一种机制来处理图标加载失败的情况,比如显示默认图标加载占位符图或给出友好的提示信息。 3. **异步加载**:图标加载应该是非阻塞的,不影响用户界面的其他操作,这通常通过`Promise`或`async/await`来实现。 4. **尺寸和格式适配**:如果图标有多种大小或格式版本,组件应该能够动态选择合适的资源,或者根据需要调整显示尺寸。 5. **API设计**:提供简单易用的接口供外部调用,例如`loadIcon(url)`或者接受预设的图标名称和大小作为参数。 以下是一个简单的JavaScript示例,展示如何创建这样一个基础的图标加载组件: ```javascript class IconLoader { constructor() { this.cache = new Map(); } loadImage(url) { if (this.cache.has(url)) { return Promise.resolve(this.cache.get(url)); } return fetch(url) .then(response => response.ok ? response.blob() : Promise.reject()) .then(blob => { const img = document.createElement('img'); img.src = URL.createObjectURL(blob); img.onload = () => { this.cache.set(url, img); URL.revokeObjectURL(img.src); // 清理资源 }; return img; }) .catch(error => { console.error('Failed to load icon:', error); return this.getDefaultImage(); // 返回默认图像 }); } getDefaultImage() { /* 实现返回默认图片 */ } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值