![]() |
Linien mit Hintergrundfarbe überzeichnen
Ich zeichne mit folgendem Code eine Raster auf ein Bitmap:
Delphi-Quellcode:
Jetzt will ich das aber auch wieder wegbekommen. Da der Hintergrund aber nicht unbedingt weiß sein muss, muss ich die Linien des Rasters mit der Hintergrundfarbe übermalen. Nur wie mache ich das? Genauer, welchen Pen Mode brauche ich?
procedure TDWFotoBook.PaintGrid(GridWidth: Integer);
var i : Integer; begin with FImageEnVect do begin for i := 0 to Width div GridWidth do begin Bitmap.Canvas.MoveTo(i * GridWidth, 0); Bitmap.Canvas.LineTo(i * GridWidth, Height); end; for i := 0 to Height div GridWidth do begin Bitmap.Canvas.MoveTo(0, i * GridWidth); Bitmap.Canvas.LineTo(Width, i * GridWidth); end; Update; end; Self.FShowGrid := True; end; |
Re: Linien mit Hintergrundfarbe überzeichnen
Hi Luckie,
schau mal in der Hilfe nach TPenMode, habe es nicht mehr im Kopf. War irgendetwas mit pmXor, pmNotXor |
Re: Linien mit Hintergrundfarbe überzeichnen
Hmpf. darüber schweigt sich die BDS 2006 Hilfe aus:
Zitat:
|
Re: Linien mit Hintergrundfarbe überzeichnen
Hier die Hilfe von Delphi 5
Die Eigenschaft Mode bestimmt, wie der Stift Linien zeichnet. type TPenMode = ( property Mode: TPenMode; Beschreibung Mit Mode können Sie bestimmen, wie sich die Farbe des Stiftes und die Farbe der Zeichenfläche beeinflussen. Die folgende Tabelle enthält die Effekte, die mit Mode erreicht werden können: Modus Pixelfarbe pmBlack Immer schwarz pmWhite Immer weiß pmNop Unverändert pmNot Komplementärefarbe zur Hintergrundfarbe der Zeichenfläche pmCopy Stiftfarbe der Eigenschaft Color pmNotCopy Komplementärfarbe zur Stiftfarbe pmMergePenNot Kombination aus Stiftfarbe und Komplementärfarbe der Zeichenfläche pmMaskPenNot Kombination von Farbanteilen, die sowohl in der Stiftfarbe als auch in der Komplementärfarbe der Zeichenfläche enthalten sind. pmMergeNotPen Kombination von Hintergrundfarbe der Zeichenfläche und komplementärer Stiftfarbe pmMaskNotPen Kombination von Farbanteilen, die sowohl im Hintergrund der Zeichenfläche als auch in der komplementären Stiftfarbe enthalten sind. pmMerge Kombination aus Stiftfarbe und Hintergrundfarbe der Zeichenfläche pmNotMerge Komplementärfarbe zu pmMerge: Kombination aus Stiftfarbe und Hintergrundfarbe der Zeichenfläche pmMask Kombination von Farbanteilen, die sowohl in der Stiftfarbe als auch in der Hintergrundfarbe der Zeichenfläche enthalten sind. pmNotMask Komplementärfarbe zu pmMask: Kombination von Farbanteilen, die sowohl in der Stiftfarbe als auch in der Hintergrundfarbe der Zeichenfläche enthalten sind. pmXor Kombination von Farbanteilen, die entweder nur im Stift oder nur im Hintergrund der Zeichenfläche enthalten sind, aber nicht in beiden. pmNotXor Komplementärfarbe zu pmXor: Kombination von Farbanteilen, die entweder nur im Stift oder nur im Hintergrund der Zeichenfläche enthalten sind, aber nicht in beiden. Hoffe es hilft |
Re: Linien mit Hintergrundfarbe überzeichnen
An meine gute alte D6 Hilfe hab eich dann auch gedacht. Ich habe es mittlerweile mit Punkten gelöst, das sieht auch besser aus:
Delphi-Quellcode:
Da gibt es nichts, was sich überschneidet, so können auch keine Reste zurückbleiben. ;)
procedure TDWFotoBook.PaintGrid(GridWidth: Integer; Show: Boolean = True);
var i : Integer; j: Integer; begin // deselect all layers, otherwise we would also draw on the selected layers FImageEnVect.LayersCurrent := 0; // set pen mode if Show then begin FImageEnVect.Bitmap.Canvas.Pen.Mode := pmBlack end else FImageEnVect.Bitmap.Canvas.Pen.Mode := pmNotXor; with FImageEnVect do begin // draw dots for i := 0 to Width div GridWidth do begin for j := 0 to Height div GridWidth do begin Bitmap.Canvas.Pixels[i * GridWidth, j * GridWidth] := clBlack; end; end; Update; end; Self.FShowGrid := True; end; |
Re: Linien mit Hintergrundfarbe überzeichnen
Ja, das waren noch Zeiten wo die Hilfe, noch eine Hilfe war. :wink:
|
Re: Linien mit Hintergrundfarbe überzeichnen
Der Code ist mittlerweile etwas an die neuen Angepasst:
Delphi-Quellcode:
Es gibt nur ein Problem: Wurde das Raster noch nicht gezeichnet (Grid = False) und soll auch nicht gezeichnet werden (Show = False), zeichnet der Code trotzdem das Raster. :wall:
procedure TFotoBook.PaintGrid(Page: TImageEnvect; Show: Boolean = True);
var i : Integer; j : Integer; begin // alle Layer deselektieren, sonst würden wir nur auf das aktuelle Layer zeichen Page.LayersCurrent := 0; // Zeichenstiftmodus setzen if (Show and not Grid) or (Show and Grid) then begin Page.Bitmap.Canvas.Pen.Mode := pmCopy; end else if (Grid and not Show) or (not Grid and not Show) then begin Page.Bitmap.Canvas.Pen.Mode := pmNotXor; end; with Page do begin Page.Bitmap.Canvas.Brush.Style := bsClear; // Punkte zeichnen for i := 0 to Width div FGridWidth do begin for j := 0 to Height div FGridWidth do begin Bitmap.Canvas.Pixels[i * FGridWidth, j * FGridWidth] := clBlack; end; end; Update; end; // Penmode zurücksetzen Page.Bitmap.Canvas.Pen.Mode := pmCopy; Self.Grid := Show; end; |
Re: Linien mit Hintergrundfarbe überzeichnen
Erstmal: die if Anweisung geht auch einfacher ;)
Delphi-Quellcode:
Und zu deinem Problem: Warum packst du nicht alles nochmal in eine if-Anweisung à la "if Show or Grid then" ?
procedure TFotoBook.PaintGrid(Page: TImageEnvect; Show: Boolean = True);
var i : Integer; j : Integer; begin // alle Layer deselektieren, sonst würden wir nur auf das aktuelle Layer zeichen Page.LayersCurrent := 0; // Zeichenstiftmodus setzen if Show then begin Page.Bitmap.Canvas.Pen.Mode := pmCopy; end else begin Page.Bitmap.Canvas.Pen.Mode := pmNotXor; end; with Page do begin Page.Bitmap.Canvas.Brush.Style := bsClear; // Punkte zeichnen for i := 0 to Width div FGridWidth do begin for j := 0 to Height div FGridWidth do begin Bitmap.Canvas.Pixels[i * FGridWidth, j * FGridWidth] := clBlack; end; end; Update; end; // Penmode zurücksetzen Page.Bitmap.Canvas.Pen.Mode := pmCopy; Self.Grid := Show; end; |
Re: Linien mit Hintergrundfarbe überzeichnen
Danke. Ich werde das morgen mal ausprobieren, jetzt ist erstmal Feierabend.
|
Re: Linien mit Hintergrundfarbe überzeichnen
So, ich habe wieder Zeit mich dem Problem zu widmen.
Die if-Anweisung geht nicht einfacher. Der Aufruf sieht wie folgt aus:
Delphi-Quellcode:
Dies wird immer dann aufgerufen, wenn ein Optionsdialog mit OK geschlossen wird. Und FShowGrid ist immer dann True, wenn der Haken, der entsprechenden Option gesetzt ist. Um jetzt zu verhindern, dass das Grid jedesmal gezeichnet wird, wenn der Dialog geschlossen wird meine entsprechende if-Abfrage: Nur dann zeichnen, wenn Haken gesetzt und wenn nicht schon vorhanden. Sinn ist der, dass wenn mehrmals übereinander gezeichnet wurde, es nicht reicht das gezeichnete einmal zu übermalen.
FotoBook.ShowGrid(FPageOptions.FShowGrid);
Also so:
Delphi-Quellcode:
if Show then
begin if not Grid then begin // Zeichnen end; end; if not Show then begin if Grid then begin // Löschen end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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