我正在编写一个Windows Api包装器,但我遇到了一个问题。我正在抽象Window Procedure(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);
}
由于此函数是静态的,因此没有此指针,它与WNDCLASSEX完美配合,但由于某种原因,它从不调用 wnd-> WndProc()和始终返回默认窗口过程。需要帮忙。怎么了?有谁知道更好的方法?
答案 0 :(得分:2)
收到WM_CREATE时调用SetWindowLong,而不是WM_NCCREATE。我不认为lpCreateParams在WM_NCCREATE中有效。那就是:
if (msg == WM_CREATE)
{
::SetWindowLong(hwnd,GWL_USERDATA,
long((LPCREATESTRUCT(lParam))->lpCreateParams));
}