作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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/
我是一名优秀的程序员,十分优秀!