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

标签 c winapi

我知道可以使用 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/

相关文章:

c++ - 滚动条闪烁

c++ - 使用 C++ 和 WinApi 显示一个额外的无模式窗口

c - 为什么 'Sizeof' 值与结构的灵活长度成员之前的字节数不同?

c - 使用 strrchr() 时出现段错误

c - 需要帮助打印按天排序的文件

c - 使用 IPC 队列发送消息时,标识符已删除 (EIDRM) 错误

在 C 中调用不同的用户定义函数

c++ - 如何防止 "How do you want to open this file"对话框?

windows - 在 ini 文件中存储 unicode 字符串时会不会出现与编码相关的问题?

c - 如果你释放一个不干净的设备上下文会发生什么?