Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas spinnt (https://www.delphipraxis.net/105846-canvas-spinnt.html)

Neutral General 31. Dez 2007 14:58


Canvas spinnt
 
Hi,

So. Ich habe ein Canvas eines Controls. Im OnPaint mal ich damit rum. Außerdem rufe ich im OnPaint folgende Funktion auf:

Delphi-Quellcode:
function DrawGradientRgn(DC: HDC; Rec: TRect; FromColor, ToColor: TColor; Clip: HRGN; Style: TGradientStyle): Boolean;
Eigentlich ganz am Anfang dieser Procedure steht folgender Code:

Delphi-Quellcode:
if Style = gsNone then
begin
  Canv := TCanvas.Create;
  try
    Canv.Handle := DC;
    Canv.Brush.Color := FromColor;
    Canv.Pen.Style := psClear;
    if Clip <> 0 then
      Canv.RoundRect(Rec.Left+1,Rec.Top+1,Rec.Right+1,Rec.Bottom+1,23,23)
    else
      Canv.Rectangle(Rec.Left+1,Rec.Top+1,Rec.Right+1,Rec.Bottom+1);
    Canv.Pen.Style := psSolid;
    exit; // darf man nicht ins finally schreiben ... finally wird trotzdem noch aufgerufen.
  finally
    Canv.Free;
  end;
end;
Aber komischerweise ist das Canvas, wenns wieder im OnPaint ist total verhunst. Man kann danach einstellen was man will, das Canvas malt mit der Farbe die ihr grad gefällt (also nicht ganz aber so grob gesagt könnte man das sagen...) Zumindest kann man festhalten :arrow: Mit dem Canvas ist danach nichts mehr anzufangen. (Das gilt vorallem für Canvas.Font.[...}

Soo.. Jetzt hab ich die Funktion geändert so das kein DC übergeben wird sondern direkt das ganze Canvas.

Delphi-Quellcode:
function DrawGradientRgn(ACanvas: TCanvas; Rec: TRect; FromColor,ToColor: TColor; Clip: HRGN; Style: TGradientStyle): Boolean;
begin
  if Style = gsNone then
  begin
    ACanvas.Brush.Color := FromColor;
    ACanvas.Pen.Style := psClear;
    if Clip <> 0 then
      ACanvas.RoundRect(Rec.Left+1,Rec.Top+1,Rec.Right+1,Rec.Bottom+1,23,23)
    else
      ACanvas.Rectangle(Rec.Left+1,Rec.Top+1,Rec.Right+1,Rec.Bottom+1);
    ACanvas.Pen.Style := psSolid;
    exit;
  end;
 
  // ...
end;
Grob gesagt: Auch Chaos, wenn auch nicht das Gleiche -.-

:arrow: :arrow: Ich verzweifle gerade etwas -.- :wall:

Gruß
Neutral General

Alter Mann 31. Dez 2007 16:02

Re: Canvas spinnt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Kann da voll mitfühlen, bin auch schon oft genug darauf reingefallen.
Es geht so definitiv nicht (mehr).

Nehme eine Bitmap, pass die Dimensionen an, zeichne den Farbverlauf und
dann mit Canvas.Draw(X, Y, Bitmap) die Bitmap.

Schon die Nerven und geht schnell.

Guten Rutsch.

Um den Fehler zu sehen, Menü-Ansicht->GradientHeader und anschließend auf Wochenansicht umstellen.

FAlter 31. Dez 2007 16:10

Re: Canvas spinnt
 
Hi,

Delphi-Quellcode:
Canv := TCanvas.Create;
Canvas ist eine abstrakte Klasse. Das, was du brauchst, ist der Nachfahr TControlCanvas.

Das "Chaos" beim direkten Übergeben der Canvas müsste nach der geposteten Stelle liegen. Dort seh ich erstmal kein Problem außer evtl. die hardgecodeten Zahlen z. B. bei RoundRect.

Eine BMP als Puffer würd ich eh nehmen, schon um Flackern zu vermeiden. Du scheinst ja erst den Hintergrund zu zeichnen und dann obendrauf was anderes.

Übrigens: Canvas spinnt nicht.

Mfg
FAlter

Muetze1 31. Dez 2007 16:15

Re: Canvas spinnt
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
if Style = gsNone then
begin
  Canv := TCanvas.Create;
  try
    Canv.Handle := DC;
    Canv.Brush.Color := FromColor;
    Canv.Pen.Style := psClear;
    if Clip <> 0 then
      Canv.RoundRect(Rec.Left+1,Rec.Top+1,Rec.Right+1,Rec.Bottom+1,23,23)
    else
      Canv.Rectangle(Rec.Left+1,Rec.Top+1,Rec.Right+1,Rec.Bottom+1);
    Canv.Pen.Style := psSolid;
    exit; // darf man nicht ins finally schreiben ... finally wird trotzdem noch aufgerufen.
  finally
    Canv.Free;
  end;
end;

Kannst du mir mal bitte den Kommentar näher erklären und auch den Sinn des "Exit"'s?

DeddyH 31. Dez 2007 16:19

Re: Canvas spinnt
 
Zitat:

Zitat von Muetze1
Kannst du mir mal bitte den Kommentar näher erklären und auch den Sinn des "Exit"'s?

Gott sei Dank, ich dachte schon, ich sei der Einzige, dem der Sinn nicht klar ist :lol:

dominikkv 31. Dez 2007 16:42

Re: Canvas spinnt
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von Muetze1
Kannst du mir mal bitte den Kommentar näher erklären und auch den Sinn des "Exit"'s?

Gott sei Dank, ich dachte schon, ich sei der Einzige, dem der Sinn nicht klar ist :lol:

das wird ein Code-Ausschnitt sein wo dannach noch was kommt

Neutral General 31. Dez 2007 17:30

Re: Canvas spinnt
 
Zitat:

Zitat von dominikkv
Zitat:

Zitat von DeddyH
Zitat:

Zitat von Muetze1
Kannst du mir mal bitte den Kommentar näher erklären und auch den Sinn des "Exit"'s?

Gott sei Dank, ich dachte schon, ich sei der Einzige, dem der Sinn nicht klar ist :lol:

das wird ein Code-Ausschnitt sein wo dannach noch was kommt

Richtig denn die Gradients werden danach gezeichnet und auf komplett andere Weise (Windows.GradientFill) und den Code muss ich dann nicht noch extra durchlaufen lassen ;)

Bin jetzt mal weg (Silvester ;) ) Gucke mir morgen nochmal an was so gesagt wurde. Wünsche euch allen schonmal nen guten Rutsch und feiert schön ;) :party:


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