List Control控件的自绘问题

Good浩 2017-01-19 09:05:10
如题,开启了Onwer Draw Fixed 风格,然后重写了CListCtrl类后 ,响应了NM_CustomDraw 这个Notify消息。 而且,代码中有CDRF_NOTIFYSUBITEMDRAW 这个返回消息,可是只有项的索引被传进来,子项所以一直为0,请问大家有什么好的解决方法吗?
...全文
263 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-01-19
  • 打赏
  • 举报
回复

//////////////////////////////////////////////////////////////
LRESULT ListViewCustomDraw(HWND hwnd, LPARAM lParam)
{
	LPNMHDR pnmh = (LPNMHDR) lParam;
        
    if (pnmh->code != NM_CUSTOMDRAW)
	{		
		return (ListViewNotify(hwnd,lParam));
	}
		
	LPNMLVCUSTOMDRAW lpNMCustomDraw = (LPNMLVCUSTOMDRAW) lParam;

	int nResult = CDRF_DODEFAULT; 
	
	if (CDDS_PREPAINT == lpNMCustomDraw->nmcd.dwDrawStage)
	{
		nResult = CDRF_NOTIFYITEMDRAW;
	}
	else if (CDDS_ITEMPREPAINT == lpNMCustomDraw->nmcd.dwDrawStage)
	{
		nResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NOTIFYPOSTPAINT;
	}
	else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == lpNMCustomDraw->nmcd.dwDrawStage)
	{
		nResult = CDRF_SKIPDEFAULT;
		
		const DWORD dwStyle = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS;
		
		HDC hdc = lpNMCustomDraw->nmcd.hdc; 
		SetBkMode(hdc,TRANSPARENT);
		int nItem = (int)lpNMCustomDraw->nmcd.dwItemSpec; 
		int nSubItem = lpNMCustomDraw->iSubItem; 
		
		BOOL bItemSelected = ListView_GetItemState(hwnd, nItem, LVIS_SELECTED);
		
		RECT subItemRect;
		ListView_GetSubItemRect(hwnd, nItem, nSubItem, LVIR_BOUNDS, &subItemRect);
//		
		HBRUSH brsh=0; 
		if (bItemSelected)
		{ 	//OutputDebugString("bItemSelected\n");
			brsh=CreateSolidBrush(RGB(255, 128, 128));
			FillRect(hdc, &subItemRect,brsh);
		}
		else
		{// not Selected
			brsh=CreateSolidBrush(RGB(51+nItem*30, 153, 255-nItem*30));
			FillRect(hdc, &subItemRect,brsh);
		}
		if(brsh) DeleteObject(brsh);
//
		if(nSubItem==0)
		{//OutputDebugString("bmp\n");
			RECT iconRect;
			ListView_GetSubItemRect(hwnd, nItem, nSubItem, LVIR_ICON, &iconRect);
			OffsetRect(&iconRect, -1, 0);
			HBITMAP oldbmp=(HBITMAP)SelectObject(g_hMemDC,g_hbmNormal);
			BitBlt(hdc,iconRect.left, iconRect.top, 16, 16,g_hMemDC,0,0,SRCCOPY);
			SelectObject(hdc,oldbmp);
		}
//
		TCHAR szText[260];
		ListView_GetItemText(hwnd, nItem, nSubItem, szText, 260);
        OffsetRect(&subItemRect, 18, 0);
		DrawText(hdc, szText, strlen(szText), &subItemRect, dwStyle);
		return nResult;
	}
	else if (CDDS_ITEMPOSTPAINT == lpNMCustomDraw->nmcd.dwDrawStage)
	{// draw (horizantal line)
		HPEN hpen=CreatePen(PS_SOLID,1,RGB(0,255,0));
		HPEN holdpen=(HPEN)SelectObject(lpNMCustomDraw->nmcd.hdc,hpen);
		RECT crc;
		GetClientRect(hwnd,&crc);
		RECT irc;
		ListView_GetItemRect(hwnd, lpNMCustomDraw->nmcd.dwItemSpec,&irc,LVIR_BOUNDS);
		HDC hdc = lpNMCustomDraw->nmcd.hdc; 
		MoveToEx(hdc,0,irc.top,0);
		LineTo(hdc,crc.right-crc.left,irc.top);
		SelectObject(hdc,holdpen);
	//
		return CDRF_DODEFAULT;
	}
	return nResult;
}
schlafenhamster 2017-01-19
  • 打赏
  • 举报
回复

void CReportCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

	if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
	{
	    *pResult = CDRF_NOTIFYITEMDRAW;
	}
    else if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
	{
	    *pResult = CDRF_NOTIFYSUBITEMDRAW;
	}
    else if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
    {
		CItemData* p = (CItemData*)(CListCtrl::GetItemData(lplvcd->nmcd.dwItemSpec));
		ASSERT(p != NULL);
		ASSERT(lplvcd->iSubItem >= 0 && lplvcd->iSubItem < p->aTextColors.GetSize());
		lplvcd->clrText = p->aTextColors[lplvcd->iSubItem];
		lplvcd->clrTextBk = p->aBkColors[lplvcd->iSubItem];
		*pResult = CDRF_DODEFAULT;
	}
}
赵4老师 2017-01-19
  • 打赏
  • 举报
回复

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧