windows 列表框控件 listbox 自定义样式

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 的 具体位置即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值