Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie verhindert man das FocusRect bei einem TTreeNode? (https://www.delphipraxis.net/67513-wie-verhindert-man-das-focusrect-bei-einem-ttreenode.html)

Codehunter 15. Apr 2006 20:40


Wie verhindert man das FocusRect bei einem TTreeNode?
 
Ich hab schon alles probiert was mir so einfällt. Ein doppeltes DrawFocusRect (da XOR-Farbe), ein FillRect darüber usw. Sogar in die VCL-Quellen vom TCustomTreeView hab ich geschaut aber nix gefunden. Hat jemand eine Idee?

marabu 16. Apr 2006 07:17

Re: Wie verhindert man das FocusRect bei einem TTreeNode?
 
Die Allgemeinheit deiner Fragestellung lässt viele Lösungen zu. Beispielsweise verschwindet das Fokus-Rechteck, wenn du den selektierten Knoten auf nil setzt. Vielleicht solltest du die Randbedingungen etwas genauer beschreiben.

PS: Eine sehr filigrane Steuerung ermöglicht übrigens das Ereignis OnAdvancedCustomDrawItem().

Frohe Ostern

marabu

Codehunter 16. Apr 2006 12:51

Re: Wie verhindert man das FocusRect bei einem TTreeNode?
 
Ich verwende derzeit OnCustomDrawItem um einen andersfarbigen Balken für selektierte Knoten zu zeichnen. Dabei bin ich auf verschiedene Probleme gestoßen. Wenn ich z.B. das NodeRect verwende das über die gesamte Client-Breite vom TreeView geht (also GetNodeRect(FALSE) ) und dabei ShowLines vom TreeView TRUE ist, übermalt das System den von mir gezeichneten Hintergrund im Bereich der Linien. Also hab ich die Linien eben abgeschaltet, ebenso die Node-Buttons.

Das FocusRect ist jetzt das letzte Problem. Scheinbar wird das erst gezeichnet wenn OnCustomDrawItem schon abgearbeitet ist.

Delphi-Quellcode:
procedure TForm1.treProductsCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
   Rect1, Rect2: TRect;
  BackColor: TColor;
begin
   if Node.StateIndex = 3 then begin
     BackColor:= $00DCC2B9;
    Rect1:= Node.DisplayRect(TRUE);
    Rect2:= Node.DisplayRect(FALSE);
    Rect1.Right:= Rect2.Right;
    Rect1.Left:= Rect1.Left - 34;
    with treProducts.Canvas do begin
      Brush.Color:= BackColor;
      FillRect(Rect2);
    end;
  end;
end;
Das Hintergrund-Rechteck rücke ich deswegen um 34 Pixel nach links weil ich Images und StateImages für jeden Node verwende. Der Hintergrundbalken soll die beiden Images noch mit umfassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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