Solved

Multiple colors in a treeview node's Text

Posted on 2003-11-05
7
1,248 Views
Last Modified: 2007-12-19
Hi everyone.

I'm using a TTreeView to display a list of item which have subitems... so far so good. Problem is that for each parent item I have more information that I'd like to display Next to the item between parenthesis, the problem I have is that I'd like the text between parenthesis to be of another color. I wrote a nice little procedure in the AdvancedCustomDraw of my treeview (see below) but for some reasons I can't get the 2 colors... Anybody has an idea?

//////////////////// BeginCode

      if cdsSelected in state then
        Font.Color := clHighlightText
      else
        Font.Color := clWindowText;

      TextOut(NodeRect.Left, NodeRect.Top, 'blah');
      li_TextWidth := TextWidth('blah');

      if cdsSelected in state then
        Font.Color := clInactiveCaptionText
      else
        Font.Color := clGray;

      TextOut(NodeRect.Left + 1 + li_TextWidth, NodeRect.Top, '(ExtraText)');
   
//////////////////// EndCode

The whole text for the Node ends up begin of clInactiveCaptionText color... Anybody has an idea?
0
Comment
Question by:A1ternity
  • 4
  • 3
7 Comments
 
LVL 26

Accepted Solution

by:
EddieShipman earned 500 total points
Comment Utility
Try this example from Serge Gubenko. I've tweeked it a bit to move the frame over a little.

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  XNodeRect :trect;
  XDC: HDC;
  XBrush, XFrame: HBrush;
  XCaption: string;
  XFormat: longint;
  XFont: TFont;
begin
  DefaultDraw:=true;
  XNodeRect:=Node.DisplayRect(true);
  if UpperCase(node.Text)='TWO (3)' then
  begin
    XNodeRect.Left:=XNodeRect.Right + 25;
    XNodeRect.Right:=XNodeRect.Right + Canvas.TextWidth(node.Text) + 25;
    XCaption:='$10';
    XFormat:=DT_VCENTER + DT_SINGLELINE + DT_CENTER;

    XDC:=GetDC(Sender.Handle);
    XBrush:=CreateSolidBrush(ColorToRGB(clYellow));
    XFrame:=CreateSolidBrush(ColorToRGB(clBlack));
    XFont:=TFont.Create;
    try
      XFont.Style:=[fsItalic, fsBold];
      XFont.Name:='Arial';
      XFont.Size:=10;

      FillRect(XDC, XNodeRect, XBrush);
      SelectObject(XDC, XFont.Handle);
      SetTextColor(XDC, clBlue);
      SetBkColor(XDC, clYellow);
      DrawText(XDC, PChar(XCaption),
               length(XCaption), XNodeRect, XFormat);
      FrameRect(XDC, XNodeRect, XFrame);
    finally
      DeleteObject(XBrush);
      DeleteObject(XFrame);
      ReleaseDC(Sender.Handle, XDC);
      XFont.Free;
    end;
  end;
end;
0
 

Author Comment

by:A1ternity
Comment Utility
Well... this method works as long as you don't have to put more than 1 color on the text of a single particular node.

Thanks for the help but sadly it didn't work for what I'm trying to do...
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
Wanna bet??
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
I do not have time to follow up on this bet but maybe you should look into
the HTMLTreeview from TMS. It allows you to format your node text with
a limited set of HTML tags, including font tags and can have multiple colors
on one line.

http://www.tmssoftware.com/htmltv.htm
0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
In HTMLTreeview, this sets the text Blah to Blue and the Text (Extra Text) to red with two space between:
(Set the Node's text property when you edit them)
<font face="MS Sans Serif" size="8" color="clblue">Blah</font>&nbsp; &nbsp;<font face="MS Sans Serif" size="8" color="clred">(Extra Text)</font>
0
 

Author Comment

by:A1ternity
Comment Utility
I will take a deeper look at the code sample you provided... I only had time to try it quickly this morning and can't return to it right now. As for using the HTML Treeview I'd rather avoid using another component...

I'll keep you informed...
0
 

Author Comment

by:A1ternity
Comment Utility
Still havn't had the time to try the solution and that part of the project is put aside for now...

Still here are your points! (won't say I'm not a good sports! Didn't even try your solution and I still pay! ;)
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now