有没有一种方法可以传递另一个参数以在此窗口回调函数中使用?

时间:2019-11-16 18:12:38

标签: c windows winapi functional-programming

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

因此,这是使用Windows API(win32)创建的某些窗口的窗口过程的函数原型。它用于处理某些窗口消息,例如当用户单击“关闭”按钮或调整窗口大小时。

WNDCLASSA window_class = {0};
window_class.style = CS_HREDRAW|CS_VREDRAW;
window_class.lpfnWndProc = WindowProc;
window_class.hInstance = instance;

在此使用此函数,作为win32 API中定义的窗口类WNDCLASSA的WNDPROC类型。如您所见,我没有传递函数原型中定义的这四个参数。

我需要传递一些额外的参数以在WindowProc函数内部的某些消息中进行处理,但是我不知道如何传递它们,并且我不想为此使用全局变量。我读到这是使用WM_CREATE消息执行此操作的一种方法,但是我不确定此方法是否正是我想要执行的操作。

有没有使用过win32 API的经验的人可以指导我实现这一目标?

2 个答案:

答案 0 :(得分:2)

创建窗口时,可以将用户定义的值(例如对象指针)与其相关联。您可以通过几种方法进行关联:

  • SetWindowLongPtr(GWLP_USERDATA)

  • SetProp()

  • SetWindowSubclass()

在您的特定情况下,SetWindowSubclass()将特别有用,因为它允许您将用户定义的值作为附加参数直接传递给消息过程,而不是将值存储在HWND中。这种方法的缺点是您的子类过程将看不到CreateWindow/Ex()发送的任何初始设置消息,并且您无法从HWND本身访问该值。

对于其他Set功能,您可以手动设置关联。您可以等到CreateWindow/Ex()退出后再调用其中一个函数,但是通常最好将用户定义的值传递给lParam的{​​{1}}参数,然后才能接收该值在CreateWindow/Ex()消息中的消息过程中,然后使用所需的WM_NCCREATE函数将其分配给HWND,然后您可以随时从HWND中检索值,尤其是在消息过程中的后续消息中,使用相应的Set函数。

答案 1 :(得分:1)

如果您在谈论自定义消息,通常的答案是创建一个结构并将指针传递给该结构的实例作为消息参数之一。许多现有消息都遵循此模型(几乎所有需要更多NMHDR的WM_NOTIFY消息)。

如果您希望某个特定窗口类处理的所有消息都可以使用一个值,一种简单的方法是使用SetWindowLongPtr设置GWLP_USERDATA值,然后使用GetWindowLongPtr检索它,这样做的缺点是可通过子类扩展。如果这是一个问题,我将遵循MFC模型,并使用CBT挂钩将自定义数据类型的实例与HWND关联。