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/)
-   -   DrawGradient und Windows 7 Basic Style (https://www.delphipraxis.net/176620-drawgradient-und-windows-7-basic-style.html)

pHL 17. Sep 2013 12:44

DrawGradient und Windows 7 Basic Style
 
Delphi-Version: XE

Hallo Leute!

Ich verwende folgende Funktion von Delphi-Treff um in einem TStringgrid einzelne Zellen mit einem Gradient zu zeichnen.

Delphi-Quellcode:
procedure TMainForm.DrawGradient(const Canvas: TCanvas; Color1, Color2: TColor;
                       ARect: TRect; GradientOrientation: TGradientOrientation);
var
  c1, c2, c: TPixelRec; //for easy access to RGB values as well as TColor value
  x, y: Integer;        //current pixel position to be set
  OldPenWidth: Integer; //Save old settings to restore them properly
  OldPenStyle: TPenStyle;//see above
begin
  Canvas.Brush.Style := bsSolid;

  c1.Color := ColorToRGB(Color1); //convert system colors to RGB values
  c2.Color := ColorToRGB(Color2); //if neccessary
  OldPenWidth := Canvas.Pen.Width; //get old settings
  OldPenStyle := Canvas.Pen.Style;
  Canvas.Pen.Width:=1;            //ensure correct pen settings
  Canvas.Pen.Style:=psInsideFrame;

  case GradientOrientation of
    goVertical:
    begin
      for y := 0 to ARect.Bottom - ARect.Top do
      begin
        c.r := Round(c1.r + (c2.r - c1.r) * y / (ARect.Bottom - ARect.Top));
        c.g := Round(c1.g + (c2.g - c1.g) * y / (ARect.Bottom - ARect.Top));
        c.b := Round(c1.b + (c2.b - c1.b) * y / (ARect.Bottom - ARect.Top));
        Canvas.Brush.Color := c.Color;
        Canvas.FillRect(Classes.Rect(ARect.Left, ARect.Top + y,
                                     ARect.Right, ARect.Top + y + 1));
      end;
    end;
    goHorizontal:
    begin
      for x := 0 to ARect.Right - ARect.Left do
      begin
        c.r := Round(c1.r + (c2.r - c1.r) * x / (ARect.Right - ARect.Left));
        c.g := Round(c1.g + (c2.g - c1.g) * x / (ARect.Right - ARect.Left));
        c.b := Round(c1.b + (c2.b - c1.b) * x / (ARect.Right - ARect.Left));
        Canvas.Brush.Color := c.Color;
        Canvas.FillRect(Rect(ARect.Left + x, ARect.Top,
                             ARect.Left + x + 1, ARect.Bottom));
      end;
    end;
  end;
  Canvas.Pen.Width := OldPenWidth; //restore old settings
  Canvas.Pen.Style := OldPenStyle;
end;
Das funktioniert soweit auch wunderbar, vor kurzem habe ich allerdings auf einigen Rechnern (die als Style Windows 7 Basic eingestellt hatten) gesehen dass die Zellen die mit einem Gradient gezeichnet werden sollten einfach nur schwarz sind.

Leider tritt dieses Problem nur sporadisch auf, d.h. dass es auch nicht auf allen Rechnern mit diesem Style auftritt und ich es bei mir auch noch nicht reproduzieren konnte.

Kennt vielleicht jemand von euch dieses Problem oder kann sich vorstellen woran es liegt?

PS: Die Werte mit denen ich die Funktion aufrufe
Color1: clWhite
Color2: $0090EE90 { Hellgrün }
RectHeight: 12
GradientOrientation: goVertical


MfG.
pHL

Morphie 17. Sep 2013 13:54

AW: DrawGradient und Windows 7 Basic Style
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann es sein, dass der Basic-Style aus einem ganz bestimmten Grund aktiviert wurde? Vielleicht weil die Grafikkarte zu schwach ist?
Aktiviere mal Testhalber den "Modus mit reduzierten Farben" bei dir. (Rechtsklick auf deine *.exe-Datei > Eigenschaften > Kompatibilität)
Das dürfte ein Grund sein, warum der Farbverlauf nicht klappt...

pHL 17. Sep 2013 16:09

AW: DrawGradient und Windows 7 Basic Style
 
Zitat:

Zitat von Morphie (Beitrag 1228806)
Kann es sein, dass der Basic-Style aus einem ganz bestimmten Grund aktiviert wurde? Vielleicht weil die Grafikkarte zu schwach ist?

Das ist definitiv nicht der Grund. Es gibt zwar Fälle bei denen das Farbschema automatisch geändert wird, ich habe es aber auf einem PC manuell testen können. Leider nur ohne Debugger.

Das mit den Farbeinstellungen habe ich auch getestet. Wenn ich das einstelle dann wird die Anzeige richtig hässlich, aber man kann immer noch alles erkennen und es gibt keine schwarzen Zellen :)

Danke dir aber!

MfG

Morphie 17. Sep 2013 16:15

AW: DrawGradient und Windows 7 Basic Style
 
Bei mir gibt es da allerdings diese schwarzen Zellen... Vielleicht liegt es an einer Kombination aus schlechter Grafikkarte und einer "unbekannten"? ;-)

pHL 17. Sep 2013 16:29

AW: DrawGradient und Windows 7 Basic Style
 
Das kann ich mir leider kaum vorstellen weil es so um die 20 komplett gleichen PC's sind, und dieser Fehler nur bei manchen (und da eben auch nicht immer) auftritt :)

Naja vielleicht finde ich den Fehler mal zufällig :) Wäre ja möglich gewesen dass es doch an der Funktion liegt

Union 17. Sep 2013 16:49

AW: DrawGradient und Windows 7 Basic Style
 
Kannst Du mir sagen warum Du im Jahre 2013 noch so Gradienten in einer Schleife malst? Verwende lieber MSDN-Library durchsuchenGradientFill, so wie es auch seit langem in den Vcl.Grids gemacht wird (Über GradientFillCanvas).

pHL 18. Sep 2013 07:20

AW: DrawGradient und Windows 7 Basic Style
 
Ja das kann ich :) Ich kannte GradientFill bis jetzt nicht, aber ich werde das jetzt umbauen und dann auf längere Zeite testen.

Danke!

Union 18. Sep 2013 08:27

AW: DrawGradient und Windows 7 Basic Style
 
Es ist ca. 1x schneller als das Manuelle Zeichnen von Linien. Auch die vielen Round-Aufrufe machen das nicht schneller. Schau Dir mal den VCL.Grids Source an. Dort wird ja damit gearbeitet (mindestens seit D2007).


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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 by Thomas Breitkreuz