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 Virtual Treeview: Hintergrundgrafik-Fragen (https://www.delphipraxis.net/71909-virtual-treeview-hintergrundgrafik-fragen.html)

JPSelter 22. Jun 2006 12:27


Virtual Treeview: Hintergrundgrafik-Fragen
 
VST bietet ja die Möglichkeit eine Hintergrundgrafik einzubinden. Gehts das auch mit Zeilen, genauergesagt eine Zeilen-Hintergrundgrafik, die die VST Hintergrundgrafik dahinter hat? Kann man die Zeilengrafik halbtransparent machen?

Was ich machen möchte: Ich will einige Zeilen mit dezenten Farben versehen, die vom Inhalt der Zeile abhängt. Die Zeile soll aber nicht die Hintergrundgrafik verdecken, sondern halbtransparent sein. Alternativ ginge eine GIF-Grafik, die ein Schachbrettmuster hat und 50% der Pixel durchsichtig sind. Im Prinzip so wie man es in HTML und einer Tabelle machen würde.

generic 22. Jun 2006 12:43

Re: Virtual Treeview: Hintergrundgrafik-Fragen
 
machbar sicherlich, aber nicht auf knopfdruck.

du wirst wohl nicht drum rum kommen im on cell erase/paint etwas zu programmieren.

JPSelter 22. Jun 2006 12:52

Re: Virtual Treeview: Hintergrundgrafik-Fragen
 
Gibts speziellere Tutorials als dieses hier?

-->http://www.dsdt.info/tutorials/virtualtreeview/

Hier werden nur wichtige Dinge beschrieben, nicht aber solche speziellen Sachen...

JPSelter 22. Jun 2006 12:59

Re: Virtual Treeview: Hintergrundgrafik-Fragen
 
Ich kann ja erstmal leicht anfangen und frage mal, wie färbe ich eine Zeile ein (vielleicht wirds ja automatisch transparent)?

Hawkeye219 22. Jun 2006 13:25

Re: Virtual Treeview: Hintergrundgrafik-Fragen
 
Hallo JPSelter,

das Windows-GDI unterstützt Alphablending (siehe MSDN-Library durchsuchenAlphaBlend). Den folgende Code habe ich schnell zusammengestrickt (es geht sicher schöner und perfomanter). Für den produktiven Einsatz solltest du die Initialisierungen (BlendParams, Bitmap) in die FormCreate-Routine verlagern:

Delphi-Quellcode:
procedure Form1.VirtualStringTree1AfterItemErase (
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  ItemRect: TRect);

  var BMP : TBitmap;
      lBlendParams: TBlendFunction;

begin

  // Parameter für Alphablending zusammstellen
  with lBlendParams do
    begin
      BlendOp := AC_SRC_OVER;
      BlendFlags := 0;
      SourceConstantAlpha := 32; // Intensität
      AlphaFormat := 0;
    end;

  BMP := TBitmap.Create;
  try

    // Farbe für Zeile wählen
    with BMP.Canvas.Brush do
      case Node.Index mod 3 of
        0 : Color := RGB(255, 0, 0);
        1 : Color := RGB(0, 255, 0);
        2 : Color := RGB(0, 0, 255);
      end;

    with ItemRect do
      begin

        // Bitmap-Größe einstellen, Bitmap einfärben
        BMP.Width := Right - Left;
        BMP.Height := Bottom - Top;
        BMP.Canvas.FillRect (Rect(0, 0, Width, Height));

        // Alphablending durchführen
        Windows.AlphaBlend(TargetCanvas.Handle, Left, Top, Right - Left, Bottom - Top,
                           BMP.Canvas.Handle, 0, 0, BMP.Width, BMP.Height, lBlendParams);

      end;

  finally
    BMP.Free;
  end;
   
end;
Gruß Hawkeye

JPSelter 23. Jun 2006 13:59

Re: Virtual Treeview: Hintergrundgrafik-Fragen
 
Ich glaube meine Frage war etwas untergegangen: Wie bekomme ich denn einfach nur eine Zelle eingefärbt?

Hawkeye219 23. Jun 2006 14:53

Re: Virtual Treeview: Hintergrundgrafik-Fragen
 
Wenn du ganze Zeilen einfärben möchtest, kannst du das in der Behandlungsroutine für OnBeforeItemErase tun:

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1BeforeItemErase(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  ItemRect: TRect; var ItemColor: TColor;
  var EraseAction: TItemEraseAction);
begin
  if Odd(Node.Index) then
    ItemColor := clLime
  else
    ItemColor := clRed;
  EraseAction := eaColor;
end;
Hast du ein mehrspaltiges TreeView, in dem du nur eine Spalte einfärben möchtest, so nimmst du die Behandlungsroutine für OnBeforeCellPaint:

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1BeforeCellPaint(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellRect: TRect);
begin
  if (Column = 0)
    begin
      TargetCanvas.Brush.Color := clYellow;
      TargetCanvas.FillRect(CellRect);
    end;
end;
Gruß Hawkeye


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