我知道可以使用SetWindowLongPtr + GWLP_USERDATA来存储指向某些数据的指针。 但是可以直接存储数据,例如“句柄”,“bool,”int“或其他更大的数据。
来自http://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644898%28v=vs.85%29.aspx,它说:
设置应用程序专用的新额外信息,例如句柄或指针。
,所以我猜存储一个句柄就可以了。我也使用这种方法存储RGB值没有问题。 但我不知道做这样的事情是不是一个好主意。我们可以存储其他大的数据(例如结构)吗?
p.s:这个问题的动机是:当我创建一个对话窗口时,我想存储每个控件的数据。当然我可以在窗口过程中使用静态变量并将指针(对它们)传递给SetWindowLongPtr函数。但这在理论上并不“完美”,因为当对话窗口关闭时,我不再需要这些数据了。当然,在实践中,我需要使用的数据非常小,我不应该关心内存的使用。但我仍然想知道是否有更好的方法。
答案 0 :(得分:9)
您只需要一个指针来存储您想要的任何内容。使用要存储的数据声明结构。在CreateWindowEx()调用之前分配它,并将指针作为最后一个参数传递。您可以在窗口过程中找到WM_CREATE消息CREATESTRUCT.lpCreateParams字段。现在调用SetWindowsLongPtr来存储该指针。
无论何时需要它,都可以使用GetWindowlongPtr来恢复指向struct的指针。您需要再次清理,使用WM_NCDESTROY消息释放指针。
请注意,这是包装winapi的C ++类库中使用的标准技术。请考虑使用其中一种而不是自己旋转。
答案 1 :(得分:3)
SetWindowLongPtr
函数可以存储一块与LONG_PTR
大小相同的数据(最有可能是32位或64位)。如果您的数据可以存储在那个大小,那么你很好。即一个bool会很好,所以大多数句柄都会处理(因为句柄也是指针)。
典型的RGB值也可以使用,因为它存储为三个字节(每个颜色分量一个字节)或四个字节(alpha通道的额外字节)。
如果你需要更多的空间,你应该在其他地方分配一个结构并存储指向该结构的指针。