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

user profile iconjeffreydj hat folgendes geschrieben Zum zitierten Posting springen:
Das kenne ich noch nicht:


Delphi-Quelltext
1:
imgTest.Canvas.Pen.Mode := pmNot;                    
Es gibt weitere interessante Modes wie XOr u.ä.

user profile iconjeffreydj hat folgendes geschrieben Zum zitierten Posting springen:
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.