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

Я уже задавал вопрос, связанный с этим, однако я думаю, что мне нужно перефразировать его

присоединение функции WNDPROC из дочернего класса

У меня есть базаКласс BaseWindow, который делегирует оконную процедуру каждого производного класса его функции-члену.

Для этого он использует WM_NCCREATE и структуру lpParams.

Если у меня есть свой собственный класс окна, и я регистрируюсьэто работает как положено.Однако если я создаю подкласс системного класса и затем пытаюсь использовать SetWindowLong (), чтобы установить его для функции делегата, он не работает.

CreateWindowEx () уже вызывает WM_NCCREATE в функции WNDPROC системного класса, прежде чем я могу изменитьЭто.Как я могу создать базовый класс, не используя это сообщение? (Потому что у меня есть несколько списков с одинаковыми свойствами и я думал о создании общего класса c ++ для всех списков).

код базового класса-

Base function-
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);
    }
}

функция для установки новой функции WNDPROC-

void SetWNDPROC()
{
      m_orig_WNDPROC=(WNDPROC) GetWindowLong(m_hwnd, GWL_WNDPROC);
    SetWindowLong(m_hwnd,GWL_WNDPROC,(long) WindowProc);
}

для создания окна-

BOOL Create() //Calls CreateWindowEx 

функция дочернего класса-

LRESULT PlayList::HandleMessage(UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_SIZE:
    {
        RECT Client;
        GetClientRect(GetParent(m_hwnd),&Client);
        MoveWindow(m_hwnd,Client.right-305,20,300,Client.bottom-90,TRUE);
        break;
    }
case WM_DESTROY:
    {
        PostQuitMessage(0);
    }

}
    return CallWindowProc(m_orig_WNDPROC,m_hwnd,message,wParam,lParam);
}

и дочерний класс называет это так:

BOOL created=Create();
SetWNDPROC();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...