Autor |
Beitrag |
jeffreydj
Hält's aus hier
Beiträge: 5
Windows XP Professional, Mac OS X Leopard
Delphi 2009
|
Verfasst: So 12.10.08 01:18
Hi,
ich habe ein kleine Progrämmchen geschrieben, um mal Canvas und die Bewegung von Shapes zu testen.
Bewege ich das Shape über die Linie, verschwindet sie, nachdem das Shape sie überdeckt hat und die Fläche wieder freigelegt wurde. Jedoch soll die Linie wieder auftauchen, sobald sie (oder ein Teil der Linie) nicht mehr vom Shape überdeckt wird.
Wie mache ich das?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); begin with PaintBox1 do begin Canvas.Pen.Width := 3; Canvas.MoveTo(5,5); Canvas.LineTo(5,30); end; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if GetKeyState(VK_LEFT) < 0 then Shape1.Left := Shape1.Left - 2; if GetKeyState(VK_RIGHT) < 0 then Shape1.Left := Shape1.Left + 2; if GetKeyState(VK_UP) < 0 then Shape1.Top := Shape1.Top - 2; if GetKeyState(VK_DOWN) < 0 then Shape1.Top := Shape1.Top + 2; end; |
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 12.10.08 01:24
Hallo und
Eine Paintbox verliert den Inhalt eben und zeichnet ihn nicht neu, wenn ein Teil der Fläche überdeckt war, bei einem TImage passiert das zum Beispiel nicht.
Aber wozu ein TShape? Zeichne doch lieber selbst ein Rechteck o.ä., oder ist dir der 3D-Effekt eines TShapes soo wichtig?
|
|
jeffreydj 
Hält's aus hier
Beiträge: 5
Windows XP Professional, Mac OS X Leopard
Delphi 2009
|
Verfasst: So 12.10.08 01:40
Okay, habs jetzt mit dem TImage gemacht.
Das Shape ist jetzt aber immer hinter der Linie (wollte es ja andersherum, also dass das Shape im Vordergrund ist).
An irgendeinen 3D-Effekt habe ich gar nicht gedacht. Ich wusste nicht einmal davon.
Wie soll ich andersweitig eine Fläche über das Formular bewegen lassen? Mit einem TImage und Cnavas? Hab einfach das schnellstmögliche genommen und einfach ein TShape draufgeschmissen.
Danke für die schnelle Antwort!
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 12.10.08 01:44
Ich hab mal schnell ne kleine Demo zusammengeklickt, siehe Anhang, du kannst mit den Pfeiltasten ein gefülltes Rechteck bewegen und mit der Maus Freihandlinien zeichnen.
// EDIT:
Auch gleichzeitig und mit festgehaltenen Pfeiltasten  .
Einloggen, um Attachments anzusehen!
|
|
jeffreydj 
Hält's aus hier
Beiträge: 5
Windows XP Professional, Mac OS X Leopard
Delphi 2009
|
Verfasst: So 12.10.08 02:13
Ah, Klasse, Danke!
Das kenne ich noch nicht:
Delphi-Quelltext 1:
| imgTest.Canvas.Pen.Mode := pmNot; |
Das Ereignis "OnKeyDown" habe ich nicht genommen, weil das mal ein Spiel werden soll und ich da die Verzögerung nicht brauche.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 12.10.08 08:09
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.10.08 10:43
Die Paintbox hat ein Ereignis OnPaint. Da gehören Zeichenoperationen hin, dann klappt' s auch mit dem Nachbarn 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.10.08 13:17
Ein Image ist eigentlich primär dazu gedacht Grafiken anzuzeigen. Zum Zeichnen sollte man eine Paintbox verwenden. Und wenn man die Zeichenoperationen im OnPaint Ereignis der Paintbox vornimmt, "verschwindet" auch nichts. Allerdings empfiehlt es sich auf ein Bitmap im Speicher zu zeichnen und dieses bei Bedarf, wenn sich was geändert hat und im OnPaint Ereignis auf den Canvas der Paintbox zu kopieren. Das ist schneller und effektiver als alles immer im OnPaint Ereignis zu zeichnen.
|
|