ListView控件的重绘相关

最近在做关于C++ ListView控件重绘相关的工作,记录一下重要的重绘逻辑

这个先解释下它在不同框架(也不能这么说),不同地方的不同

MFC:就是CListContrl类,这个封装的很好,做起来相对简单

SDK:对应的用法都在CommCtrl里面 以 ListView_开头,下面说的主要是SDK这个编程相关,不过原理都是一样的

直接上代码

 case WM_NOTIFY:
        if (reinterpret_cast<LPNMHDR>(lParam)->hwndFrom == m_hListView)//listview控件句柄
        {
            switch (reinterpret_cast<LPNMHDR>(lParam)->code)
            {
            case LVN_KEYDOWN://按下
                OnListViewKeyDown(reinterpret_cast<NMLVKEYDOWN*>(lParam));
                break;
            case NM_CUSTOMDRAW://重绘
            {
                auto* customDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(lParam);
                if (customDraw->nmcd.dwDrawStage == CDDS_PREPAINT)//画之前
                {
                    return CDRF_NOTIFYITEMDRAW;//必须返回
                }
                else if (customDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
                {
					// 去除虚线边框
					if (customDraw->nmcd.uItemState & CDIS_FOCUS)
						customDraw->nmcd.uItemState = customDraw->nmcd.uItemState & ~CDIS_FOCUS;

                    return CDRF_NOTIFYSUBITEMDRAW;//必须返回
                }
                else if (customDraw->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))//subitem就是每行子列了
                {
                    if (customDraw != nullptr /*&& customDraw->iSubItem != 0*/)
                    {
                        customDraw->clrText = RGB(109, 109, 109);//文字颜色
                    }
                    return CDRF_DODEFAULT;//必须返回
                }
            }
            break;
            }

        }

还有其他一些属性在customDraw里面 像LVN这种就是LISTVIEW NOTIFY缩写类似的还有LTN等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值