在工程中可以响应NM_CUSTOMDRAW消息来修改每个单元格的背景色与前景色,但是如何为一个单元格中的字符串赋不同的颜色呢?
前些天,偶然间看到XunLei主界面的"社区互动"列是做成了同列文本的不同色显示.试着做了一下,未遂.
想请教下各位有经验的高手该如何实现?谢谢了.

解决方案 »

  1.   

    自己画上去,什么颜色不可以?
    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;
    }
      

  2.   

    NM_CUSTOMDRAW通知可以自绘,最后返回CDRF_SKIPDEFAULT跳过控件本身的默认操作。
      

  3.   

    1楼的贴子写得有笔误,不应该是"同列文本的不同色显示"而应是"同一单元格文本的不同色显示",谢谢2楼的代码,我的要求又改了,这份代码应该不是想要的结果了. :)cnzdgs:如何自绘来实现"而应是"同一单元格文本的不同色显示"?再次感谢LZ的两位
      

  4.   

    NM_CUSTOMDRAW 消息中自己处理对应的绘图操作等,按你自己的需要画
      

  5.   

    我当时的做法如下:
        由于可以从参数得HDC,所以我将这个HDC按需要分成了若干个RECT,并设好每个RECT的left 与right成员.
    当插入一段数据时是正常的,但再用第二个RECT插入不同色的文本时,整个当前单无格就没数据了,这是怎么回事?
      

  6.   

    里面你绘制成猫狗都可以的,DrewText或者TextOut用到DC时,DC有个字体颜色属性,想改变颜色就先设置一下再画文字:MemDC->SetTextColor(RGB(...));你设置下就可以了,说的还狗不详细??