3

我知道可以使用 SetWindowLongPtr + GWLP_USERDATA 来存储指向某些数据的指针。但是可以直接存储数据,例如“句柄”、“布尔值”、“整数”或其他更大的数据。

http://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644898%28v=vs.85%29.aspx,它说:

设置应用程序专用的新额外信息,例如句柄或指针。

,所以我想存储一个句柄是可以的。我也使用这种方法毫无问题地存储 RGB 值。但我不知道这样做是否是个好主意。我们可以存储其他大数据(例如,结构)吗?

ps:这个问题的动机是:当我创建一个对话窗口时,我想为它的每个控件存储数据。当然,我可以在窗口过程中使用静态变量并将指针(指向它们)传递给 SetWindowLongPtr 函数。但这在理论上并不“完美”,因为当对话框窗口关闭时,我不再需要这些数据了。当然,在实践中,我需要使用的数据非常少,应该不用关心内存的使用情况。但我仍然想知道是否有更好的方法。

4

2 回答 2

9

你只需要一个指针来存储你想要的任何东西。使用要存储的数据声明一个结构。在 CreateWindowEx() 调用之前分配它并将指针作为最后一个参数传递。您可以在 WM_CREATE 消息、CREATESTRUCT.lpCreateParams 字段的窗口过程中将其取回。现在调用 SetWindowsLongPtr 来存储该指针。

任何时候需要它,使用 GetWindowlongPtr 来恢复指向结构的指针。您需要再次清理,使用 WM_NCDESTROY 消息释放指针。

请注意,这是包装 winapi 的 C++ 类库中使用的标准技术。请考虑使用其中之一,而不是自己旋转它。

于 2013-01-14T17:19:55.587 回答
3

该函数可以存储与(很可能是 32 位或 64 位)SetWindowLongPtr大小相同的数据。LONG_PTR如果您的数据可以以该大小存储,那就没问题了。即 bool 就可以了,大多数句柄也可以(因为句柄也往往是指针)。

一个典型的 RGB 值也可以工作,因为它被存储为三个字节(每个颜色分量一个字节)或四个字节(一个额外的 alpha 通道字节)。

如果您需要比这更多的空间,您应该在其他地方分配一个结构并存储指向该结构的指针。

于 2013-01-14T17:10:22.673 回答