CListCtrl自绘

原理:

 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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值