You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32 API中ListView自定义绘制行背景色不生效求助

解决ListView NM_CUSTOMDRAW自定义行背景不生效的问题

核心问题分析

你的代码存在几个关键错误,导致自定义颜色未生效:

  1. 错误启用了LVS_OWNERDRAWFIXED
    这个标志用于完全自绘模式(需处理WM_DRAWITEM消息),和NM_CUSTOMDRAW的半自绘模式完全冲突。必须移除这个样式,改用适合的扩展样式(比如LVS_EX_FULLROWSELECT实现整行选中)。

  2. WM_NOTIFY消息返回值处理错误
    处理NM_CUSTOMDRAW后,需要直接返回对应的CDRF_xxx值作为消息的LRESULT,而非break后让消息继续传递。系统依赖这个返回值确定是否使用你的自定义参数进行绘制。

  3. 子项绘制的冗余触发
    若需求是整行设置背景色,无需触发子项绘制(CDRF_NOTIFYSUBITEMDRAW),直接在CDDS_ITEMPREPAINT阶段设置颜色即可,减少不必要的消息交互。

修正后的代码示例

case WM_NOTIFY:
{
    LPNMHDR pNMHDR = (LPNMHDR)lParam;
    if (pNMHDR->hwndFrom == featherListView && pNMHDR->code == NM_CUSTOMDRAW)
    {
        LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;

        switch (lplvcd->nmcd.dwDrawStage)
        {
            case CDDS_PREPAINT:
                // 请求通知每个项的绘制
                return CDRF_NOTIFYITEMDRAW;

            case CDDS_ITEMPREPAINT:
            {
                int row = lplvcd->nmcd.dwItemSpec;
                if (row == 0)
                {
                    lplvcd->clrTextBk = RGB(50, 100, 200);
                    lplvcd->clrText = RGB(255, 255, 255);
                }
                else if (row % 2 == 0)
                {
                    lplvcd->clrTextBk = RGB(220, 230, 250);
                }
                else
                {
                    lplvcd->clrTextBk = RGB(240, 240, 255);
                }
                // 告知系统使用新的颜色参数绘制,不需要子项通知
                return CDRF_NEWFONT;
            }
        }
    }
    break;
}

额外注意事项

  • 确保ListView是详细视图(LVS_REPORT样式),其他视图(图标、列表)的自定义绘制行为会有所不同。
  • 扩展样式设置示例(替换原LVS_OWNERDRAWFIXED):
    ListView_SetExtendedListViewStyle(featherListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    

ListView NM_CUSTOMDRAW常见陷阱

  • 混淆自绘模式与自定义绘制模式:LVS_OWNERDRAWFIXED和NM_CUSTOMDRAW不能同时使用,前者是完全手动绘制,后者是系统协助的半自绘。
  • 忽略消息返回值:NM_CUSTOMDRAW每个阶段都需返回对应CDRF_xxx值,否则系统会忽略自定义参数。
  • 错误的绘制阶段判断:比如CDDS_PREPAINT阶段未返回CDRF_NOTIFYITEMDRAW,会导致后续项绘制通知无法触发。
  • 视图样式不匹配:不同ListView视图样式对自定义绘制的支持不同,报表视图最适合整行自定义需求。

内容的提问来源于stack exchange,提问作者helong jin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:23:14