Multiple colors in a treeview node's Text

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?
A1ternityAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Eddie ShipmanAll-around developerCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
A1ternityAuthor Commented:
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
Eddie ShipmanAll-around developerCommented:
Wanna bet??
0
Amazon Web Services

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

Eddie ShipmanAll-around developerCommented:
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
Eddie ShipmanAll-around developerCommented:
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
A1ternityAuthor Commented:
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
A1ternityAuthor Commented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.