MAKEINTRESOURCE和WM_NOTIFY如何运作?

时间:2012-06-25 08:22:56

标签: c++ windows winapi visual-c++

大家好,                关于我们使用的一些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强制转换才能从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是一个宏,它'将整数值转换为与资源管理函数'兼容的资源类型。                                                                                谢谢。

1 个答案:

答案 0 :(得分:4)

lParam不是指针,它是一个整数类型参数,因此在使用之前必须将其强制转换为正确的指针类型。

LPNMHDR只是用于历史原因的typedef。您也可以使用NMHDR*。 FAR和_far限定符与16位Windows一起使用,只是从那时起留下的噪音。

MAKEINTRESOURCE是Windows C语言接口使用的一种技巧,用于模拟重载函数在C ++中的作用。这样,您可以使用指针(字符串)参数或整数参数调用CreateDialog。这使用了永远不会在非常低的地址分配字符串的知识,因此可以将这些字符串保留为资源ID的别名。一个相当丑陋的黑客!