Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Linien mit Hintergrundfarbe überzeichnen (https://www.delphipraxis.net/89312-linien-mit-hintergrundfarbe-ueberzeichnen.html)

Luckie 29. Mär 2007 10:39


Linien mit Hintergrundfarbe überzeichnen
 
Ich zeichne mit folgendem Code eine Raster auf ein Bitmap:
Delphi-Quellcode:
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;
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?

uwewo 29. Mär 2007 10:50

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

Luckie 29. Mär 2007 10:55

Re: Linien mit Hintergrundfarbe überzeichnen
 
Hmpf. darüber schweigt sich die BDS 2006 Hilfe aus:
Zitat:

Determines how the pen draws lines on the canvas.

Class
TPen

Syntax


[Delphi] property Mode: TPenMode read FMode write SetMode;


Description
Set Mode to determine how the color of the pen interacts with the color on the canvas.

Related Information
TPen.Color
Das ist alles. Aber es müsste pmNotXOR sein, allerdings bleiben dort schwarze Punkte zurück, wo sich die Linien kreuzen. :?

uwewo 29. Mär 2007 10:57

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

Luckie 29. Mär 2007 11:13

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:
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;
Da gibt es nichts, was sich überschneidet, so können auch keine Reste zurückbleiben. ;)

uwewo 29. Mär 2007 11:45

Re: Linien mit Hintergrundfarbe überzeichnen
 
Ja, das waren noch Zeiten wo die Hilfe, noch eine Hilfe war. :wink:

Luckie 22. Mai 2007 14:29

Re: Linien mit Hintergrundfarbe überzeichnen
 
Der Code ist mittlerweile etwas an die neuen Angepasst:
Delphi-Quellcode:
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;
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:

jfheins 22. Mai 2007 15:54

Re: Linien mit Hintergrundfarbe überzeichnen
 
Erstmal: die if Anweisung geht auch einfacher ;)

Delphi-Quellcode:
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;
Und zu deinem Problem: Warum packst du nicht alles nochmal in eine if-Anweisung à la "if Show or Grid then" ?

Luckie 22. Mai 2007 15:55

Re: Linien mit Hintergrundfarbe überzeichnen
 
Danke. Ich werde das morgen mal ausprobieren, jetzt ist erstmal Feierabend.

Luckie 5. Jul 2007 13:55

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:
FotoBook.ShowGrid(FPageOptions.FShowGrid);
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.

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.
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