【发布时间】:2012-06-25 08:22:56
【问题描述】:
大家好, 我对我们使用的一些 Win32 API 数据类型和宏有些困惑:
首先-: 关于 WM_NOTIFY 消息。 lparam 包含指向 NMHDR 结构的指针。因此,如果它是一个指针,为什么像这样访问 NMHDR 结构是非法的-:
(*lparam)->idFrom
我的意思是,如果它是一个指针,那么我可以使用间接运算符来访问该结构。 LPARAM 本身是从 LONG_PTR 类型定义的。为什么一定要这样写代码-:
((LPNMHDR)lparam)->idFrom
什么是 LPNMHDR? LPNMHDR 的类型定义如下:
typedef NMHDR FAR * LPNMHDR;
FAR* 再次以下列方式定义-:
#define FAR _far
什么是 _far 以及为什么我必须使用 LPNMHDR cast 来从 LPARAM 访问 NMHDR 结构?
其次-: MAKEINTRESOURCE 宏有什么作用?我看到很多作者在为函数指定资源时使用纯字符串。例如-:
CreateDialog(hInst,"Dialog Box",
hwnd,(DLGPROC)DialogFunc);
但在现代编译器中,我们使用-:
CreateDialog(hInst,MAKEINTRESOURCE(DIALOG_BOX),
hwnd,(DLGPROC)DialogFunc);
我知道如果我们在资源文件中使用字符串标识符而不是数字,那么我们可以省略这个宏,这个宏也可以将数字转换为字符串。例如,它会将 23 转换为“23”吗?因为如果它这样做了,那么我将能够使用 -:
CreateDialog(hInst,"23",
hwnd,(DLGPROC)DialogFunc);
如果我的对话框资源是用 23 定义的。但这不起作用。
所以我想知道这个宏处理标识符后的结果是什么?它是如何工作的?我必须做什么才能在消息框中打印 MAKEINTRESOURCE 的值,因为我在使用 sprintf 函数将值复制到字符串时遇到问题。但我知道 MAKEINTRESOURCE 输出一个 LPSTR,因为它是通过以下方式定义的:
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
我还没有找到任何关于这个宏如何工作的文档。 msdn 声明 MAKEINTRESOURCE 是一个宏,它“将整数值转换为与资源管理功能兼容的资源类型”。 谢谢。
【问题讨论】:
-
这些是基本的问题,但如果不知道你知道什么就很难回答。确实需要一本书才能完整回答,我推荐amazon.com/Code-Language-Computer-Hardware-Software/dp/…
-
至于你第二个问题的答案,请看这里的答案:stackoverflow.com/questions/3610565/…
标签: c++ windows winapi visual-c++