AGB  ·  Datenschutz  ·  Impressum  







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

DrawGradient und Windows 7 Basic Style

Ein Thema von pHL · begonnen am 17. Sep 2013 · letzter Beitrag vom 18. Sep 2013
Antwort Antwort
pHL

Registriert seit: 27. Mai 2011
83 Beiträge
 
Delphi XE2 Professional
 
#1

DrawGradient und Windows 7 Basic Style

  Alt 17. Sep 2013, 11:44
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
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#2

AW: DrawGradient und Windows 7 Basic Style

  Alt 17. Sep 2013, 12:54
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...
Miniaturansicht angehängter Grafiken
8bit.png  
  Mit Zitat antworten Zitat
pHL

Registriert seit: 27. Mai 2011
83 Beiträge
 
Delphi XE2 Professional
 
#3

AW: DrawGradient und Windows 7 Basic Style

  Alt 17. Sep 2013, 15:09
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
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#4

AW: DrawGradient und Windows 7 Basic Style

  Alt 17. Sep 2013, 15:15
Bei mir gibt es da allerdings diese schwarzen Zellen... Vielleicht liegt es an einer Kombination aus schlechter Grafikkarte und einer "unbekannten"?
  Mit Zitat antworten Zitat
pHL

Registriert seit: 27. Mai 2011
83 Beiträge
 
Delphi XE2 Professional
 
#5

AW: DrawGradient und Windows 7 Basic Style

  Alt 17. Sep 2013, 15:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: DrawGradient und Windows 7 Basic Style

  Alt 17. Sep 2013, 15:49
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).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
pHL

Registriert seit: 27. Mai 2011
83 Beiträge
 
Delphi XE2 Professional
 
#7

AW: DrawGradient und Windows 7 Basic Style

  Alt 18. Sep 2013, 06:20
Ja das kann ich Ich kannte GradientFill bis jetzt nicht, aber ich werde das jetzt umbauen und dann auf längere Zeite testen.

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: DrawGradient und Windows 7 Basic Style

  Alt 18. Sep 2013, 07:27
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).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  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 18:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz