传递额外的wParam/lParam参数?

问题描述:

一个标准窗口过程函数借此原型:传递额外的wParam/lParam参数?

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

当消息如WM_MOUSEMOVEWM_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_LBUTTONDOWNRandomProc。一旦收到消息,我希望RandomProc使用Draw()重绘类Random的窗口。

的事情是,我将有多个Random变量,而且每次都会有一个窗口。所有窗口将发送消息到RandomProc,并希望它重新绘制hWnd的相应窗口。我不知道哪个随机变量根据hWnd参数或msg/wParam/lParam发送了消息,因此无法访问相应的Draw()函数并且无法重绘正确的窗口。

有没有办法每一条消息发送或有另一种方式来访问随机类,它的hWnd发送消息时的指针传递给类窗口的程序?

+1

消息旨在以每个窗口为基础发送。你的'hWnd'参数是什么?如果您希望窗口使用相同的过程,请让它们使用相同的类,或者为您使用的每个Windows类指定相应的过程。 – chris

+0

就我而言,这些类有点像“按钮”。我需要宣布其中几个。它们都具有相同的过程,因为它们都是相同类型的“按钮”,但我希望它们位于单独的类中,以便轻松控制和声明按钮。有没有办法做到这一点? – GILGAMESH

+0

但并不是每个按钮都有相同的'HWND'。这就是你通常将他们分开的方式。用'HWND'绘制'有一个大问题吗? – chris

你不找GetWindowLongPtr/SetWindowLongPtr功能?

此函数分配/从窗口句柄中检索任意指针/。您可以将指向您的Random类实例的指针分配给您创建的每个窗口。在RandomProc中,您只需使用GetWindowLongPtr并将指针投射到Random*

正如克里斯说,在评论中,使用GWLP_USERDATA属性分配的指针。

+2

有用的将是'GWLP_USERDATA'放入你自己的数据来区分。 – chris

+0

谢谢,你们俩!我认为它现在有效。 – GILGAMESH