可以使用SetWindowLongPtr + GWLP_USERDATA来存储数据(不是指针)

时间:2013-01-14 17:05:23

标签: c winapi

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

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

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

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

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

2 个答案:

答案 0 :(得分:9)

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

无论何时需要它,都可以使用GetWindowlongPtr来恢复指向struct的指针。您需要再次清理,使用WM_NCDESTROY消息释放指针。

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

答案 1 :(得分:3)

SetWindowLongPtr函数可以存储一块与LONG_PTR大小相同的数据(最有可能是32位或64位)。如果您的数据可以存储在那个大小,那么你很好。即一个bool会很好,所以大多数句柄都会处理(因为句柄也是指针)。

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

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