c++ - 窗口包装类 C++ (G++)

标签 c++ class window wrapper casting

我正在尝试学习如何在 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);
}

提前致谢,嗯。

最佳答案

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

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

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

关于c++ - 窗口包装类 C++ (G++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2935109/

相关文章:

c++ - 关于函数引用和线程的问题

c++ linux ifstream 读取csv文件

java - Actionscript 覆盖扩展接口(interface)中的方法与 Java?

c - ncurses.h,wprintw 不起作用,即使在刷新后也是如此

c++ - 设置 HWND TXT 颜色

c++ - 按值传递字符数组并从函数返回一个新的字符数组?

class - 在 F# 中使用私有(private)构造函数创建一个类

c++ - C++中的不明确访问错误

c++ - 如何在 C++ 中创建隐藏窗口

window - 很棒:alt + tab只能在两个应用之间切换