AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Linien mit Hintergrundfarbe überzeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Linien mit Hintergrundfarbe überzeichnen

Ein Thema von Luckie · begonnen am 29. Mär 2007 · letzter Beitrag vom 13. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Linien mit Hintergrundfarbe überzeichnen

  Alt 29. Mär 2007, 11:39
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 29. Mär 2007, 11:50
Hi Luckie,

schau mal in der Hilfe nach TPenMode, habe es nicht mehr im Kopf.
War irgendetwas mit pmXor, pmNotXor
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 29. Mär 2007, 11:55
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 29. Mär 2007, 11:57
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
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 29. Mär 2007, 12:13
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 29. Mär 2007, 12:45
Ja, das waren noch Zeiten wo die Hilfe, noch eine Hilfe war.
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 22. Mai 2007, 15:29
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 22. Mai 2007, 16:54
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" ?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 22. Mai 2007, 16:55
Danke. Ich werde das morgen mal ausprobieren, jetzt ist erstmal Feierabend.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Linien mit Hintergrundfarbe überzeichnen

  Alt 5. Jul 2007, 14:55
So, ich habe wieder Zeit mich dem Problem zu widmen.

Die if-Anweisung geht nicht einfacher. Der Aufruf sieht wie folgt aus:
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 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