線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2330
推到 Plurk!
推到 Facebook!

請問如何用標準Treeview在同一個Node中畫出不同顏色的Text

尚未結案
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-03 21:34:24 IP:61.59.xxx.xxx 未訂閱
大家好, 想用Treeview達到如Outlook Express樹狀的顯示方法(如下圖) 也就是要有 收件夾 (1) 的效果,在同一個Node用前後不同的顏色的字來顯示,不知道有沒有簡易的方法. 目前測試過是在Treeview的OnCustomDrawItem事件搭配Canvas->Brush->Font->Color 以及 Canvas->TextOut 來做,但是顯示出來的字的顏色總是無法達到想要的效果, 尤其是Node是選取狀態的時候, 顏色更是變成亂七八糟, 想請問有沒有哪位大大能給予相關的範例指導一下.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-04 21:07:07 IP:61.217.xxx.xxx 未訂閱
bass15 您好:    您既然已經可以達到既定的處理方式,只是處理時的顏色效果未如預期,那麼您不妨將目前寫好的處理程序貼上來,讓有經驗的人幫忙看看,或許比較容易解決您的困擾。      7 天天敲鍵盤 v 時時按滑鼠 8
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-05 00:42:54 IP:61.59.xxx.xxx 未訂閱
RedSnow 你好: 底下是我測試的Code和結果
 
void __fastcall TForm1::TreeView1CustomDrawItem(TCustomTreeView *Sender,
      TTreeNode *Node, TCustomDrawState State, bool &DefaultDraw)
{
 TRect rc = Node->DisplayRect(true);
 //先畫後面的數字 白底藍字成功
 Sender->Canvas->Brush->Color = clWhite;
 Sender->Canvas->Font->Color = clBlue;
 Sender->Canvas->TextOut(rc.right+1, rc.top+1,"(0/0)");     //畫Node->Text
 if(Node->Selected) {
  //想用藍底白字失敗
  Sender->Canvas->Brush->Color = clBlue;
  Sender->Canvas->Font->Color = clWhite;
  Sender->Canvas->TextOut(rc.left, rc.top,Node->Text );
 } else {
  //想用白底黑字失敗
  Sender->Canvas->Brush->Color = clWhite;
  Sender->Canvas->Font->Color = clBlack;
  Sender->Canvas->TextOut(rc.left, rc.top,Node->Text );
 }    }    
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-05 19:56:07 IP:61.217.xxx.xxx 未訂閱
bass15 您好:    您可以參考一下這一篇轉貼的範例程式,該範例透過 TreeView 元件 OnAdvancedCustomDrawItem 事件來處理自己的繪製動作,我覺得蠻好用的: 【轉貼】Tree-List views 設計範例 http://delphi.ktop.com.tw/topic.php?topic_id=24620 我參考該篇的範例並將您所要的動作合併在一起,寫了一段處理程序如下,大致上可以達到您所要的動作,參考一下吧:
void __fastcall TForm1::TreeView1AdvancedCustomDrawItem(
      TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State,
      TCustomDrawStage Stage, bool &PaintImages, bool &DefaultDraw)
{
    DefaultDraw = true;
    PaintImages = true;        if (Stage == cdPostPaint) {
        RECT NodeRect;
        NodeRect = Node->DisplayRect(true);
        HDC hDC = Sender->Canvas->Handle;            COLORREF clBackground = GetSysColor(COLOR_WINDOW);
        COLORREF clText = GetSysColor(COLOR_WINDOWTEXT);            if (State.Contains(cdsSelected)) {
            clBackground = GetSysColor(COLOR_BTNFACE);
            clText = GetSysColor(COLOR_WINDOWTEXT);
        }            if (State.Contains(cdsFocused)) {
            clBackground = GetSysColor(COLOR_HIGHLIGHT);
            clText = GetSysColor(COLOR_HIGHLIGHTTEXT);
        }            SetBkColor(hDC, clBackground);
        SetTextColor(hDC, clText);
        UINT uDrawMode = DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS;
        RECT rect = NodeRect;
        AnsiString sText = Node->Text;            OffsetRect(&rect, 1, 2);
        DrawText(hDC, sText.c_str(), sText.Length(), &rect, uDrawMode);            AnsiString txt = "(0/0)";
        SetTextColor(hDC, clBlue);
        SetBkColor(hDC, clWhite);
        OffsetRect(&NodeRect, (NodeRect.right-NodeRect.left) 1, 1);
        DrawText(hDC, txt.c_str(), txt.Length(), &NodeRect, uDrawMode);
    }
}
7 天天敲鍵盤 v 時時按滑鼠 8
sliver
一般會員


發表:7
回覆:6
積分:2
註冊:2010-12-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-12-17 16:41:31 IP:211.21.xxx.xxx 訂閱
請教一下是否能達到判斷node的text只要有關鍵字money就把該字顏色改為紅色,關鍵字good改為綠色,選取時一樣是籃底白字
如:
NODE
node1 show me the money please
node2 good morning
node3 how much momey


===================引 用 RedSnow 文 章===================
bass15 您好: 您可以參考一下這一篇轉貼的範例程式,該範例透過 TreeView 元件 OnAdvancedCustomDrawItem 事件來處理自己的繪製動作,我覺得蠻好用的: 【轉貼】Tree-List views 設計範例 http://delphi.ktop.com.tw/topic.php?topic_id=24620 我參考該篇的範例並將您所要的動作合併在一起,寫了一段處理程序如下,大致上可以達到您所要的動作,參考一下吧:
void __fastcall TForm1::TreeView1AdvancedCustomDrawItem(
      TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State,
      TCustomDrawStage Stage, bool &PaintImages, bool &DefaultDraw)
{
    DefaultDraw = true;
    PaintImages = true;        if (Stage == cdPostPaint) {
        RECT NodeRect;
        NodeRect = Node->DisplayRect(true);
        HDC hDC = Sender->Canvas->Handle;            COLORREF clBackground = GetSysColor(COLOR_WINDOW);
        COLORREF clText = GetSysColor(COLOR_WINDOWTEXT);            if (State.Contains(cdsSelected)) {
            clBackground = GetSysColor(COLOR_BTNFACE);
            clText = GetSysColor(COLOR_WINDOWTEXT);
        }            if (State.Contains(cdsFocused)) {
            clBackground = GetSysColor(COLOR_HIGHLIGHT);
            clText = GetSysColor(COLOR_HIGHLIGHTTEXT);
        }            SetBkColor(hDC, clBackground);
        SetTextColor(hDC, clText);
        UINT uDrawMode = DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS;
        RECT rect = NodeRect;
        AnsiString sText = Node->Text;            OffsetRect(&rect, 1, 2);
        DrawText(hDC, sText.c_str(), sText.Length(), &rect, uDrawMode);            AnsiString txt = "(0/0)";
        SetTextColor(hDC, clBlue);
        SetBkColor(hDC, clWhite);
        OffsetRect(&NodeRect, (NodeRect.right-NodeRect.left) 1, 1);
        DrawText(hDC, txt.c_str(), txt.Length(), &NodeRect, uDrawMode);
    }
}
?
?7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2017-10-21 23:51:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!