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