請問如何用標準Treeview在同一個Node中畫出不同顏色的Text |
尚未結案
|
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
大家好, 想用Treeview達到如Outlook Express樹狀的顯示方法(如下圖)
也就是要有 收件夾 (1) 的效果,在同一個Node用前後不同的顏色的字來顯示,不知道有沒有簡易的方法.
目前測試過是在Treeview的OnCustomDrawItem事件搭配Canvas->Brush->Font->Color 以及 Canvas->TextOut 來做,但是顯示出來的字的顏色總是無法達到想要的效果, 尤其是Node是選取狀態的時候, 顏色更是變成亂七八糟, 想請問有沒有哪位大大能給予相關的範例指導一下.
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |