1

好的,我有一个 ListView,我刚刚研究了如何手动设置它的回调过程:

// Sets the list view procedure
listproc = (D_ListView *) LocalAlloc(LMEM_FIXED, sizeof(D_ListView));
               listproc->oldproc = (WNDPROC)SetWindowLongPtr(g_hList, GWL_WNDPROC, (LONG)&ListViewProc);
               SetWindowLongPtr(g_hList, GWL_USERDATA, (LONG)&listproc);

我使用了一个我发现的代码示例 -D_ListView只是一个struct带有一个WNDPROC名为oldproc.

无论如何,我正在向我的 ListView 发送消息以添加项目。但我不想手动处理 ADD 消息,我想将它们传递给 ListView 的默认过程,并且只处理我需要覆盖其功能的消息。

LRESULT CALLBACK ListViewProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        // Just a test - we're getting this message so it worked
        case LVM_INSERTCOLUMN:
        {
            cout << "CREATED" << endl;

        }    
    }
    WNDPROC* wp;
    wp = (WNDPROC*)(::GetWindowLongPtr(hwnd, GWL_WNDPROC));
    return ::CallWindowProc(*wp, hwnd, msg, wParam, lParam);   
}

在上面,我不想处理 LVM_INSERTCOLUMN:我只想传递它。

有谁能帮忙吗?

谢谢,罗伯

4

1 回答 1

0

用于getWindowLongPtr (...GWL_USERDATA)获取指向您的D_ListView实例的指针,然后将任何不需要的消息转发到oldproc

::CallWindowProc(*listproc->oldproc, hwnd, msg, wParam, lParam);

于 2012-11-26T10:59:36.767 回答