MAKEINTRESOURCEA(i)的用法和作用

本文介绍了 MAKEINTRESOURCEA 宏的定义与用法,该宏用于将资源ID转换为对应的资源名称,适用于Windows编程中资源加载场景。
MAKEINTRESOURCEA(i) 的用法和作用
 
MAKEINTRESOURCEA(i)是系统所定义的宏
 
定义
  #define   MAKEINTRESOURCEA(i)   (LPSTR)((DWORD)((WORD)(i)))  
  #define   MAKEINTRESOURCEW(i)   (LPWSTR)((DWORD)((WORD)(i)))  
  #ifdef   UNICODE  
  #define   MAKEINTRESOURCE     MAKEINTRESOURCEW  
  #else  
  #define   MAKEINTRESOURCE     MAKEINTRESOURCEA  
  #endif   //   !UNICODE  
 
用法
例如:
hBmp     =     LoadBitmap(hInstance,MAKEINTRESOURCE(ID_BMP));
 
作用
作用就是将资源的ID(int型)转化为ID所对应的资源名(字符串型)
### IS_INTRESOURCE、MAKEINTRESOURCEA MAKEINTRESOURCEW 的定义及用途 #### 宏定义 在 Windows 编程中,`IS_INTRESOURCE`、`MAKEINTRESOURCEA` `MAKEINTRESOURCEW` 是用于处理资源标识符的宏。这些宏帮助开发者区分资源名称是整数还是字符串。 - **`IS_INTRESOURCE`** 这个宏用来判断一个资源句柄是否是一个整数值。如果传入的是一个整型资源 ID,则返回真;如果是字符串类型的资源名,则返回假。 ```c #define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0) ``` 此宏通过右移操作来检测高字节部分是否全为零[^4]。这表明该值可能是一个无符号短整型(即资源ID),而不是指针或其他数据结构。 - **`MAKEINTRESOURCEA` `MAKEINTRESOURCEW`** 这两个宏分别针对 ANSI 版本 Unicode 版本创建了一个适合传递给各种 Win32 函数的特殊指针形式的整数资源标识符。它们将一个小于等于 0xFFFF 的整数转换成看起来像 LPCTSTR 类型的东西,但实际上它只是简单地把低 16 位设置为目标整数值,并清除了其余所有位。 对于ANSI版本: ```c #define MAKEINTRESOURCEA(i) ((LPSTR)((UINT_PTR)((WORD)(i)))) ``` 而对于Unicode版本则是类似的逻辑但返回 LPCWSTR 类型的结果: ```c #define MAKEINTRESOURCEW(i) ((LPWSTR)((UINT_PTR)((WORD)(i)))) ``` 使用这两个宏可以确保即使是在不同的字符集模式下编译程序也能正确识别出哪些变量代表的是实际内存地址而哪些又是伪装成了指针样式的整数资源编号[^5]。 #### 实际应用案例 下面展示如何利用上述三个宏来进行有效的资源管理: 假设我们有一个对话框模板存储在一个名为IDD_ABOUTBOX 的整数资源ID当中,那么我们可以这样加载这个特定的对话框: ```cpp HINSTANCE hInst; // 假设已经初始化好实例句柄 TCHAR szTitle[MAX_PATH]; LoadString(hInst, IDS_APP_TITLE, szTitle, MAX_PATH); DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, AboutDlgProc); if (IS_INTRESOURCE(IDD_ABOUTBOX)) { MessageBox(NULL, TEXT("Resource is an integer."), szTitle, MB_OK); } else { MessageBox(NULL, TEXT("Resource is a string."), szTitle, MB_OK); } ``` 在这个例子当中,首先使用了 LoadString 来取得应用程序标题栏文字串,接着调用了 DialogBox 显示关于对话框。最后还演示了怎样借助 IS_INTRESOURCE 判断所使用的资源究竟是不是单纯的整数类型[^6]。 #### 总结说明 这三个宏的存在简化了很多有关资源管理访问的操作流程,尤其是在需要频繁切换或者兼容多种编码方式的应用场景之下显得尤为重要。了解并熟练掌握他们的工作原理有助于编写更加健壮高效的Windows平台上的C/C++代码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值