присоединение функции WNDPROC из дочернего класса - PullRequest
0 голосов
/ 14 марта 2012

У меня проблема с присоединением оконной процедуры к окну.

У меня есть базовый класс с именем BaseWindow, который использует GWPL_USERDATA для вызова виртуальной функции с именем HandleMessage() дочерних классов.

Однако, если я пытаюсь изменить оконную процедуру, не создавая пользовательский класс окна, он возвращает ошибку типа из дочерней процедуры в long.

Вот код:

static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    BaseWindow *pThis = NULL;

    if (uMsg == WM_NCCREATE)
    {
        CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
        pThis = (BaseWindow*)pCreate->lpCreateParams;
        SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);

        pThis->m_hwnd = hwnd;
    }
    else
    {
        pThis = (BaseWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    }
    if (pThis)
    {
        return pThis->HandleMessage(uMsg, wParam, lParam);
    }
    else
    {
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {return 0;};


PlayList Class : BaseWindow

SetWindowLong(m_hwnd, GWL_WNDPROC,(long)  HandleMessage); //Error

LRESULT PlayList::HandleMessage(UINT message,WPARAM wParam,LPARAM lParam) //Need to     attach this window procedure
{}

Это работает, если дочерняя процедура является статической, однако я использую нестатические члены в этой процедуре.

Я хочу создать подкласс общего элемента управления при использовании этого базового класса (поскольку большой объем кода избыточен) это возможно?

Вот весь код для базового класса: http://pastebin.com/ME8ks7XK

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Компилятору не нравится ваше объявление для HandleMessage, оно не статично.Также отсутствует CALLBACK, не очень хорошо.

Не уверен, почему вы пытаетесь это сделать, весь смысл вашей функции WindowProc () состоит в том, чтобы передать сообщение в виртуальный метод HandleMessage ().В лучшем случае вы будете использовать WindowProc в вызове SetWindowLong () вместо HandleMesssage.Или просто укажите это непосредственно в вызове CreateWindowEx ().

0 голосов
/ 14 марта 2012

Из MSDN:

Приложение подклассирует экземпляр окна с помощью функции SetWindowLong. Приложение передает флаг GWL_WNDPROC, дескриптор окна подклассу и адрес процедуры подкласса SetWindowLong. Процедура подкласса может находиться либо в исполняемом файле приложения, либо в DLL.

Итак, вы должны написать это:
SetWindowLong(m_hwnd, GWL_WNDPROC,(long) & HandleMessage);

Но это больше не компилируется! причина: все нестатические функции-члены имеют скрытый параметр this (указатель на класс владельца). Итак, вы HandleMessage не соответствует объявлению WindowProc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...