【问题标题】:Pass extra wParam/lParam parameters?传递额外的 wParam/lParam 参数?
【发布时间】:2012-06-01 17:42:43
【问题描述】:

一个标准的窗口过程函数采用这个原型:

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);
};

hWndInitialize ()初始化创建后,会向RandomProc发送WM_LBUTTONDOWN等消息。一旦收到消息,我希望RandomProc 使用Draw () 重新绘制类Random 的窗口。

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

有没有办法在每次发送消息时将指向窗口类的指针传递给过程,或者是否有其他方法可以访问 hWnd 发送消息的 Random 类?

【问题讨论】:

  • 消息是按窗口发送的。 hWnd 参数中有什么?如果您希望窗口使用相同的过程,请让它们使用相同的类,或者为您使用的每个 Windows 类指定适当的过程。
  • 在我的例子中,这些类有点像“按钮”。我需要声明其中的几个。它们都将具有相同的过程,因为它们都是相同类型的“按钮”,但我希望它们位于单独的类中,以便于控制和声明按钮。有没有办法做到这一点?
  • 但并不是每个按钮都有相同的HWND。这就是你通常如何区分它们的方式。 Draw 使用 HWND 有很大的问题吗?
  • 是的,我正在寻找一种通过HWND 告诉班级的方法。我想已经有人回答了。感谢您的帮助!

标签: c++ windows visual-studio-2010 visual-studio-2008 winapi


【解决方案1】:

您不是在寻找GetWindowLongPtr/SetWindowLongPtr 函数吗?

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

正如 Chris 在评论中所说,使用 GWLP_USERDATA 属性来分配指针。

【讨论】:

  • 有用的是GWLP_USERDATA 放入您自己的数据进行区分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2011-01-31
  • 2017-06-01
  • 2017-12-18
  • 2017-09-21
相关资源
最近更新 更多