Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TCanvas.FloodFill funktioniert nicht, wie erwartet (https://www.delphipraxis.net/103417-tcanvas-floodfill-funktioniert-nicht-wie-erwartet.html)

s-off 15. Nov 2007 14:19


TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Hallo,

ich zeichne ein RoundRect; dieses wird sofort mit der in Brush.Color definierten Farbe ausgefüllt.
Anschließend möchte ich das RoundRect mit einer anderen Farbe ausfüllen; dazu benutze ich folgenden Code, der allerdings nicht funktioniert:
Delphi-Quellcode:
      //Normales RoundRect zeichnen (Hintergrundfarbe weiß)
      MyCanvas.Brush.Color := clWhite;
      MyCanvas.RoundRect(iX1, iY1, iX + iX2, iY + iY2, iRundung, iRundung);

      //Irgendwann später dann FloodFill mit rot drüber
      MyCanvas.Brush.Color := clRed;
      MyCanvas.FloodFill(iX1 + 1, iY1 + 1, MyCanvas.Pixels[iX1 + 1, iY1 + 1], fsSurface);
Hier wird ein Roundrect gezeichnet. Der Rahmen ist schwarz, die 'Füllung' weiß.
FloodFill soll dieses RoundRect nun rot ausfüllen. Der Punkt 'iX1 + 1, iY1 + 1' liegt definitiv innerhalb des RoundRect und hat die Farbe 'weiß'. Durch fsSurface sollte nun eigentlich solange in alle Richtungen mit rot gemalt werden, bis eine andere Farbe als 'weiß' 'im Wege' steht - es passiert aber nichts - der komplette Hintergrund des RoundRect bleibt weiß.

Was mache ich falsch?

Reinhard Kern 15. Nov 2007 14:50

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Zitat:

Zitat von s-off
Der Punkt 'iX1 + 1, iY1 + 1' liegt definitiv innerhalb des RoundRect und hat die Farbe 'weiß'.
Was mache ich falsch?

Hallo,

wenn dieser Punkt innerhalb liegt, ist es kein RoundRect - höchstens eines, das zu einem normalen Rechteck entartet ist. Wenn das Eck abgerundet ist, müsste der Punkt auf dem Rand liegen oder ausserhalb.

Gruss Reinhard

Progman 15. Nov 2007 14:55

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
nimm mal statt +1 +10 oder mehr, damit du über die Rundung kommst.

s-off 15. Nov 2007 16:19

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Ach Du meine F*esse :?
Das klingt natürlich vollkommen einleuchtend! Werde es gleich mal ausprobieren!

s-off 15. Nov 2007 16:38

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Hallo nochmal,

leider hat das auch nicht geholfen.

Habe mir nun mal an dem zu prüfenden Punkt eine Linie ausgegeben, um zu sehen, ob er inerhalb des RoundRects liegt - ist nun bei diesem Beispiel der Fall.
Leider bleibt der Inhalt des RoundRects noch immer weiß - zum verzweifeln - *heul* :(

Delphi-Quellcode:
//Normales RoundRect zeichnen (Hintergrundfarbe weiß)
MyCanvas.Brush.Color := clNone;
MyCanvas.RoundRect(iX1, iY1, iX1 + iX2, iY1 + iY2, iRundung, iRundung);

//Danach FloodFill rot drüber
MyCanvas.Brush.Color := clRed;
     
//liegt Punkt im RoundRect?
//      MyCanvas.MoveTo(iX1 + 260, iY1 + 20);
//      MyCanvas.LineTo(iX1 + 260 + 30, iY1 + 20);

MyCanvas.FloodFill(iX1 + 260, iY1 + 20, MyCanvas.Pixels[iX1 + 260, iY1 + 20], fsSurface);

Progman 15. Nov 2007 16:41

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Du musst vorher Canvas.Brush.Color auf die Farbe setzen, mit der gefüllt werden soll (soweit ich das in Erinnerung habe)

s-off 15. Nov 2007 19:29

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Zitat:

Zitat von Progman
Du musst vorher Canvas.Brush.Color auf die Farbe setzen, mit der gefüllt werden soll (soweit ich das in Erinnerung habe)

Das mache ich doch in Zeile 6 - oder meinst Du etwas anderes?

Progman 15. Nov 2007 19:42

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Sorry, hab ich gar nicht gesehen...
Aber was ist oC.Pixels[iX1 + 260, iY1 + 20] ?
An dieser Stelle sollte die Farbe hin, die durch Brush.Color ersetzt wird. Da müsste auch Canvas.Pixels[..,..] stehen.

s-off 15. Nov 2007 19:47

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Upsi,

oC ist der eigentliche Name des Canvas.
Habe es nur in MyCanvas geändert, um das Ganze hier deutlicher zu machen, und um nicht die Variablendeklaration hier mit posten zu müssen. Im Quellcode ist alles auf oC. Diese eine Stelle hatte ich beim reinkopieren hier vergessen, zu ändern.

Das seltsame ist, dass es in einem einfachen nachgebauten Programm funktioniert, wenn ich auf das Canvas einer TForm male.

Bei meinem Problem handelt es sich allerdings um eine Druckroutine in ein PDF-Dokument. Hmm, vielleicht liegt dort der Hase begraben.

Progman 15. Nov 2007 19:51

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
wäre ja durchaus möglich, dass dieser Canvas kein FloodFill unterstützt?
Denn ansonsten ist kein Fehler im Code.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Seite 1 von 2  1 2      

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