详细介绍MAKEINTRESOURCE

书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程

环境:visual studio 2022

内容:【例2.39】非模态对话框

说明:以下内容大部分来自腾讯元宝。

MAKEINTRESOURCE 是 Windows API 中用于将整数资源标识符(如对话框模板 ID、图标 ID 等)转换为字符串指针的宏,以便在资源管理函数中正确引用资源。以下是其详细分析:


1. ​功能与作用

MAKEINTRESOURCE 的核心功能是将整数类型的资源 ID 转换为字符串指针,以适配 Windows 资源管理函数(如 FindResourceLoadResource)的参数要求。由于这些函数通常需要资源名称以字符串形式传递,而资源 ID 本质上是整数,因此需要通过此宏进行转换。


2. ​宏定义与实现

#define MAKEINTRESOURCE(i) ((LPCTSTR)((DWORD)((WORD)(i))))
  • 参数i 为整数类型的资源 ID(如 IDR_MYICON)。
  • 转换过程
    1. 将整数 i 强制转换为 WORD(16 位无符号整数)。
    2. 再转换为 DWORD(32 位无符号整数)。
    3. 最终转换为 LPCTSTR(指向 TCHAR 的指针,支持 Unicode 和 ANSI 编译模式)。
  • 返回值:指向整数的字符串指针(如 "IDR_MYICON")。

3. ​典型应用场景

(1) ​资源定位

在调用 FindResource 或 LoadResource 时,需将整数 ID 转换为字符串:

HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(IDR_MYICON), RT_ICON);
  • 参数说明
    • hModule:模块句柄(通常为 NULL 表示当前模块)。
    • MAKEINTRESOURCE(IDR_MYICON):转换后的资源名称。
    • RT_ICON:资源类型(如图标、位图等)。
(2) ​动态资源加载

通过资源句柄加载资源数据:

HGLOBAL hData = LoadResource(hModule, hRes);
LPVOID pData = LockResource(hData);
  • 流程
    1. FindResource 定位资源。
    2. LoadResource 加载资源到内存。
    3. LockResource 获取数据指针。

4. ​兼容性与注意事项

  • Unicode/ANSI 支持LPCTSTR 在 Unicode 编译模式下为 wchar_t*,在 ANSI 模式下为 char*MAKEINTRESOURCE 会自动适配。
  • 资源类型标识:需配合资源类型参数(如 RT_ICON)使用,避免混淆不同类型资源。
  • 错误处理:若资源未找到,FindResource 返回 NULL,需通过 GetLastError 检查错误代码。

5. ​示例代码

HMODULE hModule = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(IDR_MYICON), RT_ICON);
if (hRes) {
    DWORD size = SizeofResource(hModule, hRes);
    HGLOBAL hData = LoadResource(hModule, hRes);
    LPVOID pData = LockResource(hData);
    // 使用资源数据...
}
  • 功能:加载当前模块中的图标资源 IDR_MYICON,并获取其数据指针。

总结

MAKEINTRESOURCE 是 Windows 资源管理的核心辅助工具,通过整数到字符串的转换,简化了资源定位与加载流程。其设计兼顾了类型安全与平台兼容性,是处理资源 ID 的标准方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值