1,创建listbox :HWND list_hwd_ = CreateWindowW(L"LISTBOX", L"", WS_CHILD/* | WS_BORDER */| WS_VISIBLE | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT
| WS_VSCROLL | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS, x, y, w, h, parent, (HMENU)LIST_ID, NULL, NULL);
设置行高:SendMessage(list_hwd_, LB_SETITEMHEIGHT, (WPARAM)0, 32);
自绘border: Rectangle
2, 监听WM_DRAWITEM 消息
case WM_DRAWITEM:
LPDRAWITEMSTRUCT pDI = (LPDRAWITEMSTRUCT)lParam;
if (pDI->itemAction != ODA_DRAWENTIRE && pDI->itemAction != ODA_SELECT)
return 0;
这里 pDI 有个 hDC, 就是每行item的dc, 拿到他就可以按照自己需要的样式绘制啦
{
改变背景颜色
HBRUSH brsh = CreateSolidBrush(RGB(239, 244, 255));//yellow
FillRect(pDI->hDC, &pDI->rcItem, brsh);
DeleteObject(brsh);
还可以通过是否选中给选中添加不同的背景色
if (pDI->itemState == ODS_SELECTED)
改变字体
SelectObject(pDI->hDC, font);
SetTextColor(pDI->hDC, RGB(255, 0, 0));
WCHAR szText[260];
SendMessage(list_hwd_, LB_GETTEXT, pDI->itemID, (LPARAM)szText);
RECT rect = pDI->rcItem;
const DWORD dwStyle = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS;
DrawText(pDI->hDC, szText, (int)wcslen(szText), &rect, dwStyle);
绘制位图
pDI->rcItem 是当前item的RECT 区域
BitBlt 在加载已经在memdc里的位图绘制到pDI->rcItem 的 具体位置即可