自绘一个item我相信大部分人都在10分钟内能搞定
但是绘制非item部分的区域,同学们就傻眼了,不知道如何下手
CListCtrl的绘制机制在windows里做了一个优化,就是一个绘制循环通知过程
之所以不在OnPaint中画是考虑效率上的原因,好了我们看下这个绘制循环:
CDDS_PREERASE 准备开始擦除循环
CDDS_POSTERASE 擦除循环结束
CDDS_PREPAINT 准备开始绘制循环
CDDS_POSTPAINT 绘制循环结束
CDDS_ITEM 指定dwItemSpec, uItemState, lItemlParam参数有效
CDDS_ITEMPREERASE 准备开始列表项擦除
CDDS_ITEMPREPAINT 准备开始列表项绘制
CDDS_SUBITEM 指定列表子项
CDDS_ITEMPOSTERASE 列表项擦除结束
CDDS_ITEMPOSTPAINT 列表项绘制结束
我们这里主要是响应NM_CUSTOMDRAW来实现绘制的
在CDDS_POSTPAINT绘制循环结束时我们可以开始绘制非item的部分,如何计算非item的空间请看下面代码:
//SkinListCtrl.h
//SkinListCtrl.cpp
看效果图:
看到了吧 ,非item部分我们也绘制出来了,右边问号部分我这里没做绘制,这部分也可以绘制的,可以把斑马线顶到最右边
创建CListCtrl时样式建议如下:
这里已经画有网格线进去了,样式里就不要加这个网格线样式了,就是不用加LVS_EX_GRIDLINES 样式
OK,后面我们再来画下headerctrl就很好看了,下一篇中给出源码,并结合到CSkinListCtrl中