Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Canvas: Änderungen/Bewegungen zeichnen (https://www.delphipraxis.net/197670-canvas-aenderungen-bewegungen-zeichnen.html)

Jens01 25. Dez 2019 10:37

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Probier das mal:
Delphi-Quellcode:
TImage32.Bitmap := NewBitmap;
TImage32 assigned das neue Bitmap.

Frohe Weihnachten ...

Michael II 25. Dez 2019 11:59

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Zitat:

Zitat von Scurra (Beitrag 1453920)
(weil ich immer das komplette TImage32-Objekt austausche)

Bei GR32 musst du dich um Dinge wie "Bitmap zeichnen im Hintergrund und dann raus auf den Schirm" nicht kümmern: Du schreibst, dass du Layer verwendest. Du passt einfach die Grafik im Layer an, änderst allenfalls die Position des Layers - fertig.

Also etwa so:

Delphi-Quellcode:
MeinImage32.BeginUpdate;

BitMapLayersAnpassen...

MeinImage32.EndUpdate;
Wobei MeinImage32 ein TImage32 ist, welches den ganzen Anzeigebereich ausfüllt.

Dann ruckelt nix.

(Es gibt Demoprogramme, welche mit GR32 mitgeliefert werden.)

Scurra 27. Dez 2019 17:37

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Danke für eure Hinweise.

Ich war mal wieder etwas überängstlich. Ich tausche jetzt weiterhin jedes Mal die TImage32-Komponente aus. Beim Verändern der Formulargröße gibt es zwar einen deutlichen "Nachzieh-Effekt", aber da meine Fläche ohnehin fast nur schwarz ist, kann ich das Problem leicht beheben, indem ich auch das Panel, auf dem die TImage32-Komponente liegt, schwarz einfärbe.

Inzwischen habe ich mich schon etwas an das händische Zeichnen auf ein Canvas gewöhnt, aber mir ist da trotzdem ein Fehler aufgefallen. Oder mache ich etwas falsch?

Ich möchte eine gestrichelte Linie zeichnen. Ich habe bereits gelesen, dass die Winapi wohl fehlerhaft ist und man dazu einen gepunkteten (anstatt einem gestrichelten) Pen benutzen muss. Aber leider wird die Farbe nicht übernommen, die gestrichelte Linie wird weiß gezeichnet, unabhängig davon, welche Farbe ich wähle. Das hier ist mein Code dazu:

Delphi-Quellcode:
procedure TRunwayRenderer.DrawIlsLine(const Bitmap: TBitmap32);
var
  penHandle: HPEN;
  pen: TPen;
  logBrush: TLogBrush;
  canvas: TCanvas;
begin
  penHandle := ExtCreatePen(PS_GEOMETRIC or PS_DOT or PS_ENDCAP_FLAT or PS_JOIN_MITER, 1, logBrush, 0, nil);
  canvas := Bitmap.Canvas;
  pen := canvas.Pen;
  pen.Handle := penHandle;
  pen.Style := psDot;
  pen.Color := $00222222;

  canvas.MoveTo(1, 100);
  canvas.LineTo(500, 100);
end;
Als workaround fällt mir nur ein, die gestrichelte Linie wirklich komplett händisch zu zeichnen, also eine durchgezogene Linie zusammen mit einer Abfolge von canvas.MoveTo und canvas.LineTo zu verwenden.

Jens01 27. Dez 2019 17:55

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Ich glaube, Du verfolgst einen etwas falschen Ansatz.
Eigentlich bearbeitest Du ein TBitmap32. Dafür gibt es viele Tools und Methoden in Bitmap32. (Das ist ja der Grund, weswegen Du TBitmap32 und TImage32 verwendest.) Und portierst es dann (wie von mir gezeigt) zu TImage32.

Die Layervariante von Micheal ist noch viel besser, aber auch komplizierter. Das solltest Du machen, wenn Du noch fitter bist mit GR32.

Scurra 31. Dez 2019 08:57

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Zitat:

Eigentlich bearbeitest Du ein TBitmap32. Dafür gibt es viele Tools und Methoden in Bitmap32. (Das ist ja der Grund, weswegen Du TBitmap32 und TImage32 verwendest.)
Mir war bislang nicht klar, dass es da so viele Hilfsmittel zur Verfügung stehen. Ich habe es jetzt aber mal ausprobiert. Es hat zwar zugegebenermaßen trotz der Demo-Programme von Graphics32 über einen halben Tag gedauert, bis ich es etwas besser verstanden habe (z. B. was genau es mit dem Stippling auf sich hat), aber jetzt funktioniert es und das Ergebnis sieht mit Antialiasing wesentlich besser aus, als wenn man es von Hand zeichnet.

Zitat:

Die Farbe wird nicht angenommen, weil der LOGBRUSH-Struktur kein Farbwert zugewiesen wurde.
Generell halte ich dein Code-Beispiel für undurchdacht.
Danke, dass man dem LOGBRUSH noch eine Farbe zuweisen muss, wusste ich nicht. Mit deinem Beispiel funktioniert es jedenfalls.

Jens01 31. Dez 2019 10:48

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Es gibt nicht nur in TBitmap32 sondern auch umzu viele Tools. Ein Veraltetes hatte ich hier zuvor mal geposted. Angus hat aber zwischenzeitlich auch etwas Neues. Mußt vllt mal ausprobieren:
http://www.angusj.com/delphi/image32/Docs/Examples.htm
https://sourceforge.net/projects/image32/

Die Linien werden hierbei als gefülltes Polygon erstellt und sind deswegen besser und schärfer als die Canvas-Linien.
Aber natürlich ist der Schwierigkeitsgrad auch etwas höher.:wink:

Guten Rutsch ...

Scurra 1. Jan 2020 09:48

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Ich hoffe, ihr seid alle gut im neuen Jahr angekommen :)

Zitat:

Es gibt nicht nur in TBitmap32 sondern auch umzu viele Tools. Ein Veraltetes hatte ich hier zuvor mal geposted. Angus hat aber zwischenzeitlich auch etwas Neues. Mußt vllt mal ausprobieren:
http://www.angusj.com/delphi/image32/Docs/Examples.htm
https://sourceforge.net/projects/image32/
Ich versuche mich erst einmal bei dem "Standard" Graphics32 ;)

Weiß zufällig jemand, ob folgendes ein Bug in Graphics32 ist?
Wenn ich folgenden Code ausführe, erhalte ich in der Zeile "bitmap.LineToFSP" eine Exception, weil intern einmal versucht wird, durch 0 zu teilen (Image ist vom Typ TImage32):

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  bitmap: TBitmap32;
  bitmapLayer: TBitmapLayer;
  rect: TFloatRect;
begin
  Image.Width := 1670;
  Image.Height := 969;
  bitmapLayer := Image.Layers.Add(TBitmapLayer) as TBitmapLayer;
  rect.Left := 0;
  rect.Top := 0;
  rect.Right := Image.Width;
  rect.Bottom := Image.Height;
  bitmapLayer.Location := rect;
  bitmap := bitmapLayer.Bitmap;
  bitmap.Width := Image.Width;
  bitmap.Height := Image.Height;
  bitmap.MoveToF(-1, 485);
  bitmap.LineToFSP(-1091, 485);
end;
Es gibt in GR32 einen Codeblock, der untersucht, ob die Linie überhaupt sichtbar ist (so habe ich den Code zumindest verstanden). GR32 erkennt das in diesem Fall aber wohl nicht richtig. Wenn man die -1 durch eine -2 ersezt bei bitmap.MoveToF(), dann erkennt GR32, dass die Linie gar nicht im sichtbaren Bereich ist und verlässt die Methode.

Ich könnte natürlich in meinen Code schon eine Prüfung einbauen, damit LineToFSP in solchen Fällen gar nicht aufgerufen wird, aber dann müsste ich mir extra erst einmal einen Wrapper für TBitmap32 bauen.

Edit: Ich glaube, die Frage hat sich erledigt. Habe gerade in GitHub nachgeschaut und da gibt es schon eine neuere Version, die die Variable, durch die geteilt wird, vorher auf = 0 prüft.

Edit2: Hat zwar mit dem eigentlichen Thema nur indirekt zu tun, aber vllt. kann mir trotzdem jemand helfen: Ich möchte die neuste Version von Graphics32 installieren. Wenn ich das Package installieren möchte, dann erhalte ich jedoch folgende Fehlermeldung:

Zitat:

Package 'GR32_RRX3' kann nicht geladen werden. Es enthält die Unit 'GR32_XPThemes', die auch im Package 'GR32_RSXE5' enthalten ist.
Ich verstehe nicht ganz, wodurch diese Fehlermeldung ausgelöst wird?! Ich habe das Package GR32_RSXE5 nicht installiert. Warum wird das dann bemängelt?

Scurra 2. Jan 2020 10:59

AW: Canvas: Änderungen/Bewegungen zeichnen
 
Zitat:

Ich verstehe nicht ganz, wodurch diese Fehlermeldung ausgelöst wird?! Ich habe das Package GR32_RSXE5 nicht installiert. Warum wird das dann bemängelt?
Ich konnte das Problem nun lösen: In den Verzeichnissen C:\Users\Public\Documents\Embarcadero\Studio\20.0\ Bpl und C:\Users\Public\Documents\Embarcadero\Studio\20.0\ Cdp lagen noch Dateien mit dem Package. Diese Dateien habe ich gelöscht.
Ich glaube, das Problem war, dass ich noch ein weiteres Package benutze, das auf das "veraltete" Package verwiesen hat. Jetzt kann ich zwar dieses Package nicht mehr benutzen, aber das brauche ich eigentlich auch nicht mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr.
Seite 3 von 3     123   

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