Einzelnen Beitrag anzeigen

NickelM

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

AW: TreeView CustomDrawItem - Windows 7 Themes

  Alt 15. Apr 2012, 10: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