在工程中可以响应NM_CUSTOMDRAW消息来修改每个单元格的背景色与前景色,但是如何为一个单元格中的字符串赋不同的颜色呢?
前些天,偶然间看到XunLei主界面的"社区互动"列是做成了同列文本的不同色显示.试着做了一下,未遂.
想请教下各位有经验的高手该如何实现?谢谢了.
前些天,偶然间看到XunLei主界面的"社区互动"列是做成了同列文本的不同色显示.试着做了一下,未遂.
想请教下各位有经验的高手该如何实现?谢谢了.
case NM_CUSTOMDRAW:
{
LPNMLVCUSTOMDRAW lpnmcd = (LPNMLVCUSTOMDRAW)pnmh;
if(lpnmcd ->nmcd.dwDrawStage ==CDDS_PREPAINT)
{
return CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT;
}
else if(lpnmcd ->nmcd.dwDrawStage ==CDDS_ITEMPREPAINT)
{
return CDRF_NOTIFYSUBITEMDRAW;
}
else if(lpnmcd ->nmcd.dwDrawStage == (CDDS_SUBITEM | CDDS_ITEMPREPAINT))
{
int iItem = lpnmcd->nmcd.dwItemSpec;
int iSubItem = lpnmcd->iSubItem;
if(iItem >= 0 && iSubItem >= 0)
{
RECT rSubItem = {0};
HDC hDC = lpnmcd->nmcd.hdc; GetSubItemRect(iItem, iSubItem, LVIR_LABEL, &rSubItem); if (iSubItem==0)
{
rSubItem.left=0; // 第一列画到最左
}
bool bSelected = false;
if(GetItemState(iItem, LVIS_SELECTED))
{
bSelected = true;
} bool bFocus = false;
if(IsChild(::GetFocus()) || m_hWnd == ::GetFocus())
{
bFocus = true;
}
//双缓冲
CRect rDraw(rSubItem);
CMemoryDC memDC(lpnmcd->nmcd.hdc,rDraw);
memDC.SetBkMode(TRANSPARENT);
memDC.SetTextColor(RGB(0,0,0)); // 文本颜色(可以通过iItem和iSubItem判断是个单元格)
CFont font;
font.CreateFont(12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体")); memDC.SelectFont(font); CString strText;
GetItemText(iItem,iSubItem,strText);
strText+=_T(" ");
if (iItem%2==0) //奇数行
{
draw_row_bg(memDC,rDraw,bSelected,bFocus,true); }
else // 偶数行
{
draw_row_bg(memDC,rDraw,bSelected,bFocus,false);
}
memDC.DrawText(strText,strText.GetLength(),&rDraw,DT_SINGLELINE|DT_RIGHT|DT_VCENTER|DT_END_ELLIPSIS); }
return CDRF_SKIPDEFAULT;
}
}
}
break;
default:
break;
}
由于可以从参数得HDC,所以我将这个HDC按需要分成了若干个RECT,并设好每个RECT的left 与right成员.
当插入一段数据时是正常的,但再用第二个RECT插入不同色的文本时,整个当前单无格就没数据了,这是怎么回事?