gpt4 book ai didi

c++ - 消息处理程序未调用窗口过程

转载 作者:行者123 更新时间:2023-11-28 03:48:09 26 4
gpt4 key购买 nike

我正在编写一个 Windows Api 包装器,但遇到了一个问题。我正在抽象窗口过程 (WndProc) 并编写一个静态 MsgHandler,它将调用我的 WinHandler 类的 WndProc。这是代码:

LRESULT CALLBACK WinHandle::MsgHandler(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
WinHandle* wnd = 0;

if (msg == WM_NCCREATE)
{
::SetWindowLong(hwnd,GWL_USERDATA,
long((LPCREATESTRUCT(lParam))->lpCreateParams));
}

wnd = (WinHandle*) (::GetWindowLong(hwnd,GWL_USERDATA));

if (wnd)
return wnd->WndProc(msg,wParam,lParam);
else
return ::DefWindowProc(hwnd,msg,wParam,lParam);
}

由于此函数是静态的,因此没有this 指针,它与 WNDCLASSEX 完美配合,但出于某种原因,它从不调用 wnd->WndProc() 并且始终返回默认窗口过程。需要帮忙。怎么了?有人知道更好的方法吗?

最佳答案

当您收到 WM_CREATE 而不是 WM_NCCREATE 时调用 SetWindowLong。我认为 lpCreateParams 在 WM_NCCREATE 中无效。即:

if (msg == WM_CREATE)
{
::SetWindowLong(hwnd,GWL_USERDATA,
long((LPCREATESTRUCT(lParam))->lpCreateParams));
}

关于c++ - 消息处理程序未调用窗口过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6717023/

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