- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
大家好, 我对我们使用的某些 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 是一个宏,它“将整数值转换为与资源管理函数兼容的资源类型”。 谢谢。
最佳答案
lParam
不是一个指针,它是一个整型参数,所以你必须在使用前将它转换为正确的指针类型。
LPNMHDR
只是出于历史原因使用的 typedef。您也可以使用 NMHDR*
。 FAR 和 _far 限定符用于 16 位 Windows,只是当时遗留下来的噪音。
MAKEINTRESOURCE
是 Windows C 语言接口(interface)使用的一个技巧,用于模拟重载函数在 C++ 中的作用。通过这种方式,您可以使用指针(指向字符串)参数或整数参数调用 CreateDialog
。这使用了字符串永远不会分配到非常低的地址的知识,因此可以将这些保留为资源 ID 的别名。一个相当丑陋的 hack!
关于c++ - MAKEINTRESOURCE 和 WM_NOTIFY 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11185736/
我有一个 MFC 对话框和一个 ActiveX 网格控件。每当用户尝试编辑日期类型的网格单元格时,我都会创建一个 CDateTimeCtrl 并显示在网格内。此控件是作为网格控件的子控件创建的,但它是
我希望定义一个新的 nofication id,它将在我的子类控件的 WM_COMMAND 消息中使用。但是我没有找到任何创建用户控件定义的通知代码的规则。 最佳答案 参见技术说明 20、21 和 2
这是一个用于控制win32 api中的消息的理论问题。 WM_COMMAND 和 WM_NOTIFY 有什么区别?我们什么时候需要处理这些消息,什么时候选择忽略它们? 之所以产生这种疑问是因为这两个消
我有一个带有 ListView 控件的 C++/Win32 应用程序。当应用程序启动并初始化控件时,如果在 ListView 中选择或更改了项目,它会收到 WM_NOTIFY。 但是在从菜单打开另一个
大家好, 我对我们使用的某些 Win32 API 数据类型和宏有些困惑-: 首先-:关于 WM_NOTIFY 消息。 lparam 包含指向 NMHDR 结构的指针。所以如果它是一个指针,为什么像这样
我正在尝试修复 SHBrowseForFolder 对话框,因为它不会对文件夹重命名使用react(BFFM_SELCHANGED 未被发送并且无法确定路径现在是否正确) .我用谷歌搜索了一个解决方案
WM_NOTIFY 消息通常用于就地“工具提示”(消息气球)和其他控件通知,但如果我将控件放置在 TFrame 上,则这些控件永远不会出现 WM_NOTIFY 消息。为什么这些消息不再发送到我的表单,
The documentation for WM_NOTIFY says : wParam: The identifier of the common control sending the mess
作为引用,我正在使用 this 中概述的窗口父类(super class)方法文章。如果我想处理来自父类(super class)中的基本控件的 WM_NOTIFY 消息(即用于自定义绘图),则会出现
我是一名优秀的程序员,十分优秀!