窗口过程不被消息处理程序调用

时间:2011-07-16 11:26:53

标签: c++ oop winapi wrapper

我正在编写一个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()和始终返回默认窗口过程。需要帮忙。怎么了?有谁知道更好的方法?

1 个答案:

答案 0 :(得分:2)

收到WM_CREATE时调用SetWindowLong,而不是WM_NCCREATE。我不认为lpCreateParams在WM_NCCREATE中有效。那就是:

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