在对话框中,有一个ctreectrl,默认情况下,当你点中其中的一个item时,该item变为蓝色,表明该item是当前选择的item。若输入焦点转移至另外一个控件上,该item为灰色。
请问我如何能够自定义这两种颜色,是不是在DrawItem中,请教具体该怎么做?
多谢了!

解决方案 »

  1.   

    void CMyTreeCtrl::OnPaint() 
    {
    CPaintDC dc(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CRect rcClip, rcClient;
    dc.GetClipBox(&rcClip);
    GetClientRect(&rcClient);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
    memDC.SelectObject(&bitmap);
    CRgn rgn;
    rgn.CreateRectRgnIndirect(&rcClip);
    memDC.SelectClipRgn(&rgn);
    rgn.DeleteObject();
    CWnd::DefWindowProc(WM_PAINT,(WPARAM)memDC.m_hDC,0);
    HTREEITEM hItem = GetFirstVisibleItem();
    int n = GetVisibleCount()+1;
    while(hItem && n--)
    {
    CRect rect;
    CFont *pFontDC;
    CFont fontDC;
    LOGFONT logfont;
    CFont *pFont = GetFont();
    pFont->GetLogFont(&logfont);
    fontDC.CreateFontIndirect(&logfont);
    UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
    pFontDC = memDC.SelectObject(&fontDC);
    CString sItem = GetItemText(hItem);
    GetItemRect( hItem, &rect, TRUE );
    if (!(GetItemState(hItem, selflag) & selflag))memDC.SetBkColor(RGB(0,255,0));
    else memDC.SetBkColor(RGB(255,0,0));
    memDC.TextOut(rect.left+2,rect.top+1,sItem);
    memDC.SelectObject(pFontDC);
    hItem = GetNextVisibleItem(hItem);
    }
    dc.BitBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),&memDC, 
    rcClip.left,rcClip.top,SRCCOPY);
    }
      

  2.   

    处理NM_CUSTOMDRAW消息void CMyTreeCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT *pResult)
    {
        LPNMTVCUSTOMDRAW plvcd = (LPNMTVCUSTOMDRAW)pNMHDR;
        *pResult = CDRF_DODEFAULT;    if (CDDS_PREPAINT == plvcd->nmcd.dwDrawStage)
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
        }
        else if(plvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
        {
            if(plvcd->clrTextBk == GetSysColor(COLOR_HIGHLIGHT))
            {
                plvcd->clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);
                plvcd->clrTextBk = RGB(255, 0, 128);
            }
            else if(plvcd->clrTextBk == GetSysColor(COLOR_INACTIVECAPTIONTEXT))
            {
                plvcd->clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);
                plvcd->clrTextBk = RGB(192, 168, 96);
            }
        }
    }例子代码
    http://my.6to23.com/cigarette/tr1.zip