原理:
CListCtrl绘制有很多阶段,响应控件的NM_CUSTOMDRAW消息后,要根据自己的需要判断当前的绘制阶段,在正确的绘制阶段编写代码,以达到控件的自绘效果.
CListCtrl的绘制阶段:
CDDS_PREERASE 准备开始擦除循环;
CDDS_POSTERASE 擦除循环结束;
CDDS_PREPAINT 准备开始绘制循环;
CDDS_POSTPAINT 绘制循环结束;
CDDS_ITEM 绘制项(行)的时候需要使用该项,指定dwItemSpec, uItemState, lItemlParam参数有效 ;
CDDS_ITEMPREERASE 准备开始列表项擦除;
CDDS_ITEMPREPAINT 准备开始列表项绘制;
CDDS_SUBITEM 指定列表子项;
CDDS_ITEMPOSTERASE 列表项擦除结束;
CDDS_ITEMPOSTPAINT 列表项绘制结束;
简单的颜色自绘代码:
void CMyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
NMCUSTOMDRAW nmcd = lpLVCustomDraw->nmcd;
*pResult = 0;
switch(nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
// 绘制项(行)
case CDDS_ITEMPREPAINT:
// 绘制子项(列)
case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
// nmcd.dwItemSpec 项(行)
// lpLVCustomDraw->iSubItem 子项(列)
// SetItemText(nmcd.dwItemSpec, lpLVCustomDraw->iSubItem, szText)
if ((nmcd.dwItemSpec + lpLVCustomDraw->iSubItem)%2)
{
lpLVCustomDraw->clrText = RGB(rand()%255,rand()%255,rand()%255);
}
else
{
lpLVCustomDraw->clrText = CLR_DEFAULT;
}
break;
}
*pResult |= CDRF_NOTIFYPOSTPAINT;
*pResult |= CDRF_NOTIFYITEMDRAW;
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
}
void CMyListCtrl::SetDefaultStyle()
{
//设置列表风格
LONG dwStyles;
dwStyles = GetWindowLong(m_hWnd,GWL_STYLE);
dwStyles &= ~LVS_TYPEMASK;
dwStyles |= LVS_REPORT ;
SetWindowLong(m_hWnd,GWL_STYLE,dwStyles);
SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
}