gpt4 book ai didi

c - 将数据存储在自定义索引: GWLP_USERDATA_EX?中

转载 作者:行者123 更新时间:2023-11-30 15:08:21 25 4
gpt4 key购买 nike

如何使用 SetWindowLongPtr(_In_ HWND hWnd, _In_ int nIndex, _In_ LONG_PTR dwNewLong) 将数据存储在自定义索引中?

例如;

SetWindowLongPtr(hwnd, GWLP_USERDATA_CUSTOM, (LONG_PTR)dispatcher);

来自msdn documentation ; nIndex 参数应该是:

The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer.

不太明白这是什么意思?如何确定可用的额外窗口内存字节数?本质上,我已经在使用 GWLP_USERDATA 来存储指针,因此空间不足。如果我可以将信息存储在另一个索引中,那将非常有用。

最佳答案

通过 WNDCLASS 结构的 cbWndExtra 成员注册窗口类时,您可以决定可用的额外窗口字节数。

例如,如果我说

wc.cbWndExtra = sizeof (LONG) + sizeof (void *);

然后我可以将 LONGvoid * 填充到我的窗口中

SetWindowLongW(hwnd, 0, myLONGValue);
SetWindowLongPtrW(hwnd, sizeof (LONG), (LONG_PTR) myPointerValue);

(为了安全起见,我总是以指针大小整数的倍数存储值,并专门使用 SetWindowLongPtrW()。)

您在对话框中使用的各种 DWLP_xxx 常量也以这种方式工作。

请注意,这意味着您自己注册了窗口类;也就是说,您是调用 RegisterClass()RegisterClassEx() 的人。如果您没有这样做,那么您根本没有权限访问索引 0 之外的内存(除非窗口类的作者允许您这样做,就像对话框和 DWLP_xxx 的情况一样)。如果您有一个现有的窗口句柄并且需要将一些与该窗口相关的数据填充到某处,那么您就得靠自己了。 (如果您要对窗口进行子类化,则 Common Controls 6 子类化例程为您提供了一种将一个指针大小的整数与子类一起存储的方法,这很有帮助。)

必要时用“指针”替换“指针大小的整数”。

关于c - 将数据存储在自定义索引: GWLP_USERDATA_EX?中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com