Laden...

WinForm: Wie kann ich einen Shape bewegen?

Erstellt von GeneVorph vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.330 Views
G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 5 Jahren
WinForm: Wie kann ich einen Shape bewegen?

Hallo,

ich möchte eine Shape (Kreis) auf einem Panel erstellen und bewegen.

Dazu habe ich folgendes Tesprojekt:

  • eine WinForm
  • darauf ein Panel
  • eine Timer-Instanz

Und folgenden Code:


        
        private int _xCoordinate;
        private int _yCoordinate;

        public Form1()
        {
            InitializeComponent();

            _xCoordinate = 245;
            _yCoordinate = 10;
        }

        
        private void tmrMovement_Tick(object sender, EventArgs e)
        {
            _xCoordinate += 10;

            Invalidate();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.FillEllipse(Brushes.Red, _xCoordinate, _yCoordinate, 10, 10);
        }


Meine Überlegung war jetzt folgende: der Timer feuert alle 100 ms und die Shape wird über die _xCoordinate um den Betrag 10 verschoben.

Starte ich das Programm, wird die Shape zwar gezeichnet, aber das war es dann auch schon. Keine Bewegung. Der Timer ist enabled. Habe ich noch einen Schritt vergessen?

Und wenn wir schon dabei sind: ich möchte - später - beim Programmstart die Shape erstellen lassen, die Bewegung soll aber erst einsetzen, wenn ein Button gedrückt wurde.

Vielen Dank im Voraus!
Vorph

4.931 Beiträge seit 2008
vor 5 Jahren

Hast du die Tick-Methode denn korrekt im Designer abonniert (mit tmrMovement_Tick)?
Setze mal einen Haltepunkt in diese Methode, s. [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Ansonsten nutze mal explizit


panel1.Invalidate();

Wenn du den Timer später starten möchtest, dann setze Enabled im Designer auf false und starte den Timer erst in der Button_Click-Methode:


tmrMovement.Enabled = true;
// oder
tmrMovement.Start();

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 5 Jahren

Ansonsten nutze mal explizit

  
panel1.Invalidate();  
  

Ich hasse solche kleinen, mistigen Fehler! Danke, Th69!

Ich hatte gestern einen Breakpoint in meinem Code gesetzt, und bin schon fast verzweifelt, weil die Methode jedesmal aufgerufen wurde, Invalidate() aufgerufen wurde und das ganze trotzdem nicht funktionierte^^

Ich hatte in einer Vorversion statt dem Panel einfach die Shape auf der Form gezeichnet. Da funktioniert es natürlich mit Invalidate(). An den expliziten Aufruf habe ich gar nicht mehr gedacht!

Gruß
Vorph