Entwickler-Ecke
Multimedia / Grafik - Canvas verschwindet, nachdem Shape sich darüber bewegt
jeffreydj - So 12.10.08 01:18
Titel: Canvas verschwindet, nachdem Shape sich darüber bewegt
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 - So 12.10.08 01:24
Hallo und :welcome: ;-)
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 - 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 - 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 ;-).
jeffreydj - 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 - So 12.10.08 08:09
jeffreydj hat folgendes geschrieben : |
Das kenne ich noch nicht:
Delphi-Quelltext 1:
| imgTest.Canvas.Pen.Mode := pmNot; | |
Es gibt weitere interessante Modes wie XOr u.ä.
jeffreydj hat folgendes geschrieben : |
Das Ereignis "OnKeyDown" habe ich nicht genommen, weil das mal ein Spiel werden soll und ich da die Verzögerung nicht brauche. |
Das dachte ich mir, aber so war es für das Beispiel einfacher als zu schauen welches Intervall ich nehmen sollte außerdem wusste ich ja nicht ob du KeyPreview kennst ;-).
Delete - So 12.10.08 10:43
Die Paintbox hat ein Ereignis OnPaint. Da gehören Zeichenoperationen hin, dann klappt' s auch mit dem Nachbarn ;)
Delete - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!