CTreeCtrl、同一item、文本呈现不同颜色的有关问题,多谢(100)

CTreeCtrl、同一item、文本呈现不同颜色的问题,谢谢(100)
如图所示,

 - C盘:
  + 360Rec
  + Documents

对于同一个tree-item,想让其文本呈现不同的颜色,
比如:"360Rec"那个item,呈现效果是:360(红色显示),Rec(黑色显示)。
如何实现?

------------------------------------
有试过响应NM_CUSTOMDRAW,不知道怎么做好,整个item使用同一颜色倒是好弄。
总不能整个item("360Rec")全部自绘吧(像节点间的连线、item前的图标,要是自绘的画就有的麻烦了)??


------解决方案--------------------
http://blog.csdn.net/hurryboylqs/article/details/5548605
------解决方案--------------------
自绘TreeCtrl控件可以实现你的效果..。
------解决方案--------------------
只自绘text
------解决方案--------------------
估计你的全自绘了
怕麻烦可以找一个现成的改改
------解决方案--------------------
发过去了,希望对你学习界面的自绘有帮助...
------解决方案--------------------
大概是:
void CTreectrlDlg::OnCustDrawTree(NMHDR *pNMHDR,LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pDraw=(LPNMTVCUSTOMDRAW)pNMHDR;
DWORD dwDrawStage=pDraw->nmcd.dwDrawStage;
UINT uItemState =pDraw->nmcd.uItemState;
//
*pResult=CDRF_NOTIFYITEMDRAW;
//|CDRF_NOTIFYPOSTPAINT|CDRF_NOTIFYSUBITEMDRAW|CDRF_NOTIFYPOSTERASE;
CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);
HTREEITEM hSelect=m_Tree.GetSelectedItem();
//
HTREEITEM hItem=(HTREEITEM) pDraw->nmcd.dwItemSpec;
// label only !
if((dwDrawStage & CDDS_ITEM) && (hItem==hSelect))// not (uItemState & CDIS_SELECTED))
{// 
CRect rc;
m_Tree.GetItemRect(hItem,&rc,TRUE);//FALSE);text only
CString txt=m_Tree.GetItemText(hItem);
pdc->FillSolidRect(&rc,RGB(255,0,0));//clr);
//
pdc->SetTextColor(RGB(255,255,255));//white
pdc->SetBkColor(RGB(255,0,0));//clr);
//
pdc->TextOut(rc.left+2,rc.top+2,"360");
pdc->TextOut(rc.left+26,rc.top+2,"rec");
*pResult |= CDRF_SKIPDEFAULT;// there are also image, box ...
}
}

------解决方案--------------------
只绘text也行,image,box还让它自己画。下面的方法也可用于其它控件的个性绘制。

方法如下:
C/C++ code

void CMyTree::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CTreeCtrl::OnPaint()

    CRect rcClient;
    GetClientRect(&rcClient);

    const COLORREF crTreeBack = RGB(255, 255, 255);//GetBkColor();
    const COLORREF crTreeText = RGB(0, 0, 0);//GetTextColor();
    dc.FillSolidRect(rcClient, crTreeBack);

        //执行默认绘制动作
    DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0); 

    HTREEITEM ht = GetFirstVisibleItem();
    int nVisibleCount = GetVisibleCount();

    const DWORD TVIS_FOCUSED           = 0x0001;

    dc.FillSolidRect(rc, crBack);
    dc.SetBkMode(TRANSPARENT);
    CFont *pOldFont = dc.SelectObject(GetFont());

    while(ht && nVisibleCount--)
    {
        UINT uState = GetItemState(ht, TVIS_SELECTED | TVIS_FOCUSED);

        COLORREF crBack = (uState & TVIS_SELECTED)? RGB(49,106,197) : crTreeBack;
        COLORREF crText = (uState & TVIS_SELECTED)? RGB(255,255,255) : crTreeText;

        CRect rc;
        GetItemRect(ht, &rc, TRUE);
                
        CString sText = GetItemText(ht);                
        if(sText == _T("360Rec"))
        {
            dc.SetTextColor(RGB(255,0,0));
            dc.DrawText(_T("360"), &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX);
            dc.SetTextColor(RGB(0,0,0));

            CRect rcRange;
            dc.DrawText(_T("360"), &rcRange, DT_SINGLELINE|DT_CALCRECT);
            CRect newRc = rc;
            newRc.left += rcRange.Width();
            dc.DrawText(_T("Rec"), &newRc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX);
        }
        else
        {
            dc.SetTextColor(crText);
            dc.DrawText(sText, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX);
                    }

        if(uState & TVIS_SELECTED)
        {
            dc.DrawFocusRect(rc);
        }

        ht = GetNextVisibleItem(ht);
    }

    dc.SelectObject(pOldFont);

}