我知道可以使用 SetWindowLongPtr + GWLP_USERDATA 来存储指向某些数据的指针。 但是是否可以直接存储数据,例如“句柄”、“ bool 值”、“整数”或其他更大的数据。
来自 http://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644898%28v=vs.85%29.aspx ,它说:
设置应用程序私有(private)的新的额外信息,例如句柄或指针。
,所以我想存储句柄是可以的。我也使用这种方法毫无问题地存储了一个 RGB 值。 但我不知道这样做是否是个好主意。我们可以存储其他大数据(例如,结构)吗?
p.s:这个问题的动机是:当我创建一个对话框窗口时,我想为它的每个控件存储数据。当然,我可以在窗口过程中使用静态变量并将指针(指向它们)传递给 SetWindowLongPtr 函数。但这在理论上并不“完美”,因为当对话框窗口关闭时,我就不再需要这些数据了。当然在实际中,我需要用到的数据很少,内存的使用情况应该不会太在意。但我还是想知道是否有更好的方法。
最佳答案
你只需要一个指针来存储你想要的任何东西。使用要存储的数据声明一个结构。在 CreateWindowEx() 调用之前分配它并将指针作为最后一个参数传递。您可以在 WM_CREATE 消息的窗口过程中取回它,CREATESTRUCT.lpCreateParams 字段。现在调用 SetWindowsLongPtr 来存储该指针。
任何时候你需要它回来,使用 GetWindowlongPtr 来恢复指向结构的指针。您需要再次清理,使用 WM_NCDESTROY 消息释放指针。
请注意,这是包装 winapi 的 C++ 类库中使用的标准技术。请考虑使用其中之一,而不是自己旋转。
关于可以使用 SetWindowLongPtr + GWLP_USERDATA 来存储数据(不是指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14323113/