AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView CustomDrawItem - Windows 7 Themes

Ein Thema von NickelM · begonnen am 6. Apr 2012 · letzter Beitrag vom 15. Apr 2012
Antwort Antwort
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#1

AW: TreeView CustomDrawItem - Windows 7 Themes

  Alt 15. Apr 2012, 09:36
Habe es hinbekommen. Mit ein bischen Tricksen aber es geht. Wenn es interessiert hier eine kleine Doku.
Natürlich kann man dies nach belieben erweitern:
Delphi-Quellcode:
//Beim Items hinzufügen, die ihr selber Zeichnen wollt:
//Anstelle von 'Test' könnt ihr auch Variablen einfügen
var Text : PChar;
GetMem(Text,(Length('Test')+1)*SizeOf(Length));
StrPCopy(Text,'Test');
TreeView1.Items.Add(nil,'').Data := Text;
//Beim OnAdvancedCustomDrawItem
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
var NodeRect,TextRect : TRect;
    TextP : PChar;
    NewText : String;
    UndPos : Integer;
begin
  if (Stage = cdPrePaint) then
  begin
    If Node.Data <> nil then //Falls ihr noch normale Einträge habt, müsst ihr die If-Anweisung schreiben
    TextP := Node.Data;
    PaintImages := False; //Falls ihr eine ImageList eingefügt habt, und keine Bilder zeichen lassen wollt
  end;
  if (Stage = cdPostPaint) then
  begin
    If Node.Data <> nil then //Falls ihr noch normale Einträge habt, müsst ihr die If-Anweisung schreiben
    TextP := Node.Data;
    TextRect := Node.DisplayRect(True); //Um den linken Seitenabstand vom "normalen" Textanfang zubekommen
    NodeRect := Node.DisplayRect(False); //Gesammten Zeilen-Rect abfragen
    NodeRect.Left := TextRect.Left - 16; //NodeRect Left aktualisieren
    //NodeRect.Left := TextRect.Left; //Falls ihr die Bilder zeichnen lasst, müsst ihr diese Zeile steht die oben drüber nehmen
    SetBkMode(TreeView1.Canvas.Handle,TRANSPARENT);
    
    //Kleine Hilfsfunktion, da sonst das & Zeichen nicht angezeigt wird
    UndPos := Pos('&',TextP);
    if UndPos > 0 then
      NewText := StringReplace(TextP,'&','&&',[rfReplaceAll])
    else
      NewText := TextP;

    DrawText(TreeView1.Canvas.Handle,PChar(NewText),Length(NewText),
    NodeRect,TextFlags); //Für TextFlags halt die entsprechenden Flags einsetzten
    //Weitere Zeichenoperationen
    end;
  end;
end;
Ich muss zugeben, es nicht wirklich schön, aber es funktioniert.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz