【问题标题】:Window Wrapper Class C++ (G++)窗口包装类 C++ (G++)
【发布时间】:2011-02-25 11:31:04
【问题描述】:

我正在尝试学习如何在 C++ 中创建窗口,我看过一篇关于创建包装类的文章,但我并不真正理解它。到目前为止,我知道你不能有一个类方法 WndProc(我不知道为什么),但老实说,仅此而已。有人可以给出解释,同时解释 reinterpret_cast 吗? Here是文章。

LRESULT CALLBACK Window::MsgRouter(HWND hwnd, UINT message,
                                   WPARAM wparam, LPARAM lparam)
{
  Window *wnd = 0;

  if(message == WM_NCCREATE)
  {
    // retrieve Window instance from window creation data and associate
    wnd = reinterpret_cast<Window *>((LPCREATESTRUCT)lparam)->lpCreateParams;
    ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast<long>(wnd));

    // save window handle
    wnd->SetHWND(hwnd);
  }
  else
    // retrieve associated Window instance
    wnd = reinterpret_cast<Window *>(::GetWindowLong(hwnd, GWL_USERDATA));

  // call the windows message handler
  wnd->WndProc(message, wparam, lparam);
}

先谢谢了,嗯。

【问题讨论】:

    标签: c++ class window wrapper casting


    【解决方案1】:

    MsgRouter() 过程充当 Windows 消息处理系统到与 HWND 关联的 Window 实例之间的代理。它将 Windows 消息路由到 C++ 对象。

    指向Window 实例的指针通过CreateWindow() 函数的最后一个参数传递给MsgRouter() 过程。当您第一次通过CreateWindow()(或CreateWindowEx())创建HWND 时,会发送一些消息——其中一个是WM_NCCREATE。当过程接收到WM_NCCREATE 消息时,LPARAM 参数包含指向CREATESTRUCT 的指针,其中包含传递给CreateWindow() 函数的参数。该过程从CREATESTRUCT 中检索Window 实例指针,并通过将其设置为HWND 的属性将其保存在HWND 中(GWL_USERDATA 通过SetWindowLong())。

    现在指针已经被保存,从现在开始,窗口过程可以在收到消息时通过GetWindowLong()HWND 中检索指向原始Window 实例的指针。最后,窗口过程在检索到的Window 指针上调用WndProc(),传入确切的消息和参数,因此Window 实例可以处理该消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2014-05-21
      • 2015-07-09
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多