Autor Beitrag
jeffreydj
Hält's aus hier
Beiträge: 5

Windows XP Professional, Mac OS X Leopard
Delphi 2009
BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

Windows XP Professional, Mac OS X Leopard
Delphi 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

Windows XP Professional, Mac OS X Leopard
Delphi 2009
BeitragVerfasst: So 12.10.08 02:13 
Ah, Klasse, Danke!

Das kenne ich noch nicht:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 12.10.08 08:09 
user profile iconjeffreydj hat folgendes geschrieben Zum zitierten Posting springen:
Das kenne ich noch nicht:

ausblenden 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 ;-).
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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



BeitragVerfasst: 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.