将系统子类WNDPROC委托给一个函数

时间:2012-03-15 11:07:36

标签: winapi visual-c++

我已经问了一个与此相关的问题,但我认为我需要改写它

attaching WNDPROC function from child class

我有一个名为BaseWindow的基类,它将每个派生类的窗口过程委托给它的成员函数。

它使用WM_NCCREATE和lpParams结构来实现这一目标。

如果我有自己的窗口类并且我注册它,它按预期工作。但是,如果我将系统类子类化,然后尝试使用SetWindowLong()将其设置为委托函数,则它不起作用。

CreateWindowEx()已经在系统类的WNDPROC函数上触发WM_NCCREATE,然后才能更改它。如何在不使用此消息的情况下创建基类?(因为我有一些具有相同属性的列表框,并且正在考虑为所有列表框创建一个通用的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();

0 个答案:

没有答案