15,979
社区成员
发帖
与我相关
我的任务
分享
//////////////////////////////////////////////////////////////
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;
}
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;
}
}