最近在做关于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等