C++ winapi ListView NM_CUSTOMDRAW : not getting CDDS_ITEMPREPAINT

标签 c++ windows listview winapi

我正在尝试更改我从资源创建的 ListView 的行文本颜色。为此,我在对话过程中处理 NM_CUSTOMDRAW。如果重要的话,这是一个模态对话框。根据the documentation , dwDrawStage 在返回 CDRF_NOTIFYITEMDRAW 后应该等于 CDDS_ITEMPREPAINT。但这种情况并非如此。我收到每件商品的 CDDS_PREPAINT

我做错了什么?

这是我回复消息的方式:

        case WM_NOTIFY:

        if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hwnd, IDC_List2) && ((LPNMHDR)lParam)->code == NM_CUSTOMDRAW) 
        {
            int result = CDRF_DODEFAULT;
            LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)lParam;
            switch (lplvcd->nmcd.dwDrawStage) 
            {
                case CDDS_PREPAINT:
                    result = CDRF_NOTIFYITEMDRAW;
                    break;
                case CDDS_ITEMPREPAINT: //never gets executed
                    lplvcd->clrText = RGB(255, 0, 0);
                    result = CDRF_NEWFONT;
                    break;
            }

            //SetWindowLongPtr(hEdit, DWLP_MSGRESULT, result);
            //return TRUE;
            return result;
        }
        break;

这些是 ListView 的属性:

IDC_List2,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,205,18,363,197,WS_EX_CLIENTEDGE

最佳答案

我发现了问题: WM_NOTIFY 在对话框中处理,所以我当然必须 return the values accordingly .问题是,我为窗口使用了错误的变量(在本例中为 hEdit)。

如果有人关心,这是更正后的版本:

case WM_NOTIFY:

        if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hwnd, IDC_List2) && ((LPNMHDR)lParam)->code == NM_CUSTOMDRAW) 
        {
            int result = CDRF_DODEFAULT;
            LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)lParam;
            switch (lplvcd->nmcd.dwDrawStage) 
            {
                case CDDS_PREPAINT:
                    result = CDRF_NOTIFYITEMDRAW;
                    break;
                case CDDS_ITEMPREPAINT:
                    lplvcd->clrText = RGB(255, 0, 0);
                    result = CDRF_NEWFONT;
                    break;
            }
            SetWindowLongPtr(hDialog, DWLP_MSGRESULT, result);
            return TRUE;
        }
        break;

关于C++ winapi ListView NM_CUSTOMDRAW : not getting CDDS_ITEMPREPAINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549962/

相关文章:

Android:将选定的 ListView 项存储在全局变量中

java - Android - 在不更改布局的情况下在 ListView 之间切换?

c++ - std::for_each,调用带有引用参数的成员函数

c++ - undefined reference ,带有std::experimental::可选,尽管存在符号

c++ - 给定 64 位虚拟地址空间,有什么理由不在堆栈上声明 32KB 数组?

c++ - 字符串作为文件名

CreateProcessWithLogonW 和AssignProcessToJobObject

c# - 在Windows窗体中,当用户单击滚动条时如何阻止UI线程阻塞?

c++ - 从句柄获取文件路径

java - 在 ListView 中通过 onitemclicklistner 从 Hashmap 中删除值