代码之家  ›  专栏  ›  技术社区  ›  Ell

窗口包装类C++(g++)

  •  2
  • Ell  · 技术社区  · 15 年前

    我正试图了解C++中创建窗口的过程,我已经看了一篇关于创建包装类的文章,但我并不真正理解它。到目前为止,我知道你不能有一个类方法wndproc(我不知道为什么),但老实说,这就是全部。有人能解释一下,也解释一下重新解释一下吗? 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);
    }
    

    提前谢谢,嗯。

    1 回复  |  直到 15 年前
        1
  •  4
  •   In silico    15 年前

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

    指向的指针 窗口 实例传递到 MSGROUNTER() 通过的最后一个参数 CreateWindow() 功能。当您第一次创建 HWND 通过 创建窗口() (或) CreateWindowEx() )发送了一些消息-其中一条消息是 WM_NCCREATE . 当程序接收到 WMN NCCREATE 消息 LPARAM 参数包含指向 CREATESTRUCT 其中包含传递到 创建窗口() 功能。该过程检索 窗口 实例指针来自 创建结构 把它保存在 HWND 通过将其设置为 HWND ( GWL_USERDATA 通过 SetWindowLong() )

    现在指针已经保存,窗口过程可以从现在开始检索指向原始指针的指针 窗口 实例从 HWND 通过 GetWindowLong() 当它收到消息时。最后,窗口过程调用 WndProc() 在找回的 窗口 指针,传递准确的消息和参数,因此 窗口 实例可以处理消息。