![]() |
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:
Hier wird ein Roundrect gezeichnet. Der Rahmen ist schwarz, die 'Füllung' weiß.
//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); 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? |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Zitat:
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 |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
nimm mal statt +1 +10 oder mehr, damit du über die Rundung kommst.
|
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Ach Du meine F*esse :?
Das klingt natürlich vollkommen einleuchtend! Werde es gleich mal ausprobieren! |
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); |
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)
|
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Zitat:
|
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. |
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. |
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. |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Zitat:
Ich meine ein direkt von TCanvas abstammendes Objekt muss doch sämtliche Methoden von TCanvas unterstützen, oder? Das Canvas habe ich ja selber instanziiert und übergebe es dann an die PDF-Engine, die mir daraus ein PDF-Dokument bastelt. |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
naja, wie gesagt, auf Canvas von TForm, TBitmap, TPaintBox etc. funktioniert das ja auch. Warum es bei deinem Canvas nicht klappt, ist mir auch ein Rätsel.
|
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Zitat:
Danke für Deine Unterstützung. Vielleicht fällt ja jemandem über Nacht noch etwas schlaues zum Thema ein :stupid: |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
:wink: Hallo,
habe das gleiche Problem. Schein wohl irgendwie am Canvas von TMetaFile zu liegen. Bei der Ausgabe in andere Canvas funktioniert mein FloodFill ohnen Probleme. Hast Du Dein Problem inzwischen gelöst? Wenn ja wäre ich über eine kurze Info dankbar. |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Hallo,
nein, ich konnte das Problem mit besagtem Canvas leider nicht lösen; es scheint da tatsächlich Unterschiede zu geben, so dass Canvas nicht gleich Canvas ist :? |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Hi,
Welches Handle weißt du denn deinem Canvas zu? Also ich hab das nachgebaut (halt nicht mit pdf, aber ansonsten gleich) und es funktioniert (wie du ja auch schon gesagt hast... Gruß Neutral General |
Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
Mir ist gerade noch eingefallen, dass der Autor dieses PDF-Canvas mir auch eine Begründung gab, warum das nicht funktionierte; moment, ich suche mal...
So, habs gefunden - hier die Antwort: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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