gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:22:22 26 4
gpt4 key购买 nike

我正在尝试学习如何在 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 消息处理系统与与 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 实例可以处理消息。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com