OwnerDrawn窗口

Joã*_*ito 0 c++ winapi listbox ownerdrawn

我没有成功地绘制我自己的列表框,继承人的代码:

LRESULT CALLBACK ListBoxProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch (msg)
        {
               case WM_DRAWITEM:
                    LPDRAWITEMSTRUCT Item;
                    Item = (LPDRAWITEMSTRUCT)lParam;

                if (Item->itemState == ODS_SELECTED)
                {
                    FillRect(Item->hDC, &Item->rcItem, CreateSolidBrush(0));
                    SetTextColor(Item->hDC, 0x0000FF);
                }
                else
                {
                    SetBkColor(Item->hDC, 0);
                    FillRect(Item->hDC, &Item->rcItem, (HBRUSH)GetStockObject(BLACK_BRUSH));
                    SetTextColor(Item->hDC, 0xFFFFFF);
                }
                LPSTR lpBuff;
                SendMessageA(Item->hwndItem , LB_GETTEXT, Item->itemID, (LPARAM)lpBuff);
                TextOutA(Item->hDC, Item->rcItem.left, Item->rcItem.top, (lpBuff), strlen(lpBuff)-1);
                if (Item->itemState & ODS_FOCUS)
                {
                   DrawFocusRect(Item->hDC, &Item->rcItem);
                }
                return true;
                break;
           case WM_MEASUREITEM:
                break;
           default:
                   DefWindowProcA(hwnd, msg, wParam, lParam);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我像这样创建ListBox:

lbLogs = CreateWindowExA(0, "LISTBOX", "", WS_VISIBLE + WS_CHILD + WS_BORDER + LBS_HASSTRINGS + LBS_NOINTEGRALHEIGHT + WS_TABSTOP, 15, 115, 515, 180, hwnd, (HMENU)1005, hInstance, NULL);
         //-----------------------------
         SetWindowLong(lbLogs, GWL_WNDPROC, (LONG)&ListBoxProcedure);
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释它有什么不对吗?我正在尝试制作一个包含黑色bg和红色文本的列表框,当一个项目被选中时,它的文本会转换为白色.但是列表框只是不添加任何内容.

cbr*_*nch 5

您正在创建一个列表框,然后安装自己的WNDPROC来处理发送到列表框的邮件.但是,所有者绘制列表框会向其所有者发送WM_MEASUREITEM和WM_DRAWITEM消息,因此您需要在父窗口的WNDPROC中处理这些消息,而不是列表框WNDPROC.

此外,即使子类化是正确的方法(在这种情况下不是这样),您的子类WNDPROC应该将未处理的消息传递给原始列表框WNDPROC,而不是DefWindowProc().绕过原始列表框WNDPROC很可能会造成麻烦.