书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程
环境:visual studio 2022
内容:【例2.39】非模态对话框
说明:以下内容大部分来自腾讯元宝。
MAKEINTRESOURCE
是 Windows API 中用于将整数资源标识符(如对话框模板 ID、图标 ID 等)转换为字符串指针的宏,以便在资源管理函数中正确引用资源。以下是其详细分析:
1. 功能与作用
MAKEINTRESOURCE
的核心功能是将整数类型的资源 ID 转换为字符串指针,以适配 Windows 资源管理函数(如 FindResource
、LoadResource
)的参数要求。由于这些函数通常需要资源名称以字符串形式传递,而资源 ID 本质上是整数,因此需要通过此宏进行转换。
2. 宏定义与实现
#define MAKEINTRESOURCE(i) ((LPCTSTR)((DWORD)((WORD)(i))))
- 参数:
i
为整数类型的资源 ID(如IDR_MYICON
)。 - 转换过程:
- 将整数
i
强制转换为WORD
(16 位无符号整数)。 - 再转换为
DWORD
(32 位无符号整数)。 - 最终转换为
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);
- 流程:
FindResource
定位资源。LoadResource
加载资源到内存。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 的标准方式。