Оконная процедура не вызывается обработчиком сообщений - PullRequest
0 голосов
/ 16 июля 2011

Я пишу оболочку Windows Api и столкнулся с проблемой. Я абстрагирую оконную процедуру (WndProc) и написал статический MsgHandler, который будет вызывать WndProc моего класса WinHandler. Вот код:

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 () и всегда возвращает процедура окна по умолчанию. Нужна помощь. Что случилось? Кто-нибудь знает лучший подход?

1 Ответ

2 голосов
/ 16 июля 2011

Вызовите SetWindowLong, когда вы получите WM_CREATE, а не WM_NCCREATE. Я не думаю, что lpCreateParams действителен в WM_NCCREATE. То есть:

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