标准的窗口过程函数采用以下原型(prototype):
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
当出现诸如
WM_MOUSEMOVE
或WM_CHAR
之类的消息时,WndProc
函数将接收消息所源自的窗口以及任何其他参数,这些参数将与msg和wParam/lParam一起使用。我现在正在上一个类。说
class Random
{
public:
void Initialize ();
private:
void Draw ();
HWND hWnd;
friend LRESULT CALLBACK RandomProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
};
在
hWnd
初始化并创建了Initialize ()
之后,它将向WM_LBUTTONDOWN
发送消息,例如RandomProc
。收到消息后,我希望RandomProc
使用Draw ()
重绘Random
类的窗口。问题是,我将有多个
Random
变量,每个变量都有一个窗口。所有窗口都会将其消息发送到RandomProc
,并希望其重绘hWnd
的相应窗口。我不知道哪个随机变量基于hWnd参数或msg/wParam/lParam发送了消息,因此无法访问适当的Draw ()
函数,并且无法重绘正确的窗口。是否有一种方法可以在每次发送消息时将指向该窗口的类的指针传递给Procedure,或者是否有另一种方法来访问其hWnd发送了消息的Random类?
最佳答案
您不是在寻找 GetWindowLongPtr
/ SetWindowLongPtr
函数吗?
该函数向/从窗口句柄分配/获取任意指针。您可以将指向您的Random类实例的指针分配给您创建的每个窗口。在RandomProc
中,您只需要使用GetWindowLongPtr
并将指针转换为Random*
即可。
就像克里斯在评论中所说的那样,使用GWLP_USERDATA
属性分配指针。