[gelöst]Rotate Transform Problem



  • Hallo.
    Ich versuche gerade eine Analoge Uhr zu programmieren und stoße da auf ein Problem mit den Zeigern.
    Ich will 2 Zeiger(minuten und Sekunden) sich in unterschiedlichen Tempos rotieren lassen. Das geht aber iwie nicht, weil sich der Minutenzeiger trotzdem mit den Sekundenzeiger mitbewegt.
    Erstmal mein Code:

    [cs]using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Analoge_Uhr
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            struct Sekundenzeiger
            {
    
                public int Sek;
                public int SekDreh;
    
                public void DrawSekunden(Graphics g)
                {
                    g.TranslateTransform(138, 136);
                    g.RotateTransform(SekDreh);
                    g.DrawLine(new Pen(Color.Green, 1), 0, 0, 0,-72);
                }
            }
            struct Minutenzeiger
            {
    
                public int Min;
                public int MinDreh;
    
                public void DrawMinuten(Graphics g)
                {
                    g.TranslateTransform(138, 136);
                    g.RotateTransform(MinDreh);
                    g.DrawLine(new Pen(Color.Red, 3), 0, 0, 0, -50);
                }
            }
            Sekundenzeiger Sekunden;
            Minutenzeiger Minuten;
            private int X;
            private int Y;
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Pen Uhr = new Pen(Color.Black, 5);
                e.Graphics.DrawEllipse(Uhr, 62, 62, 150, 150);
                Sekunden.DrawSekunden(e.Graphics);
                Minuten.DrawMinuten(e.Graphics);
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Sekunden.Sek = DateTime.Now.Second;
                Sekunden.SekDreh += Sekunden.Sek *6;
                X = Sekunden.Sek;
                Minuten.Min = DateTime.Now.Minute;
                Minuten.MinDreh += Minuten.Min * 6;
                Y = Minuten.Min;
                timer2.Start();
                timer1.Start();
    
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
    
                Minuten.MinDreh += 6;
                Y++;
    
                if (Y > 60)
                    Y = 1;
                label1.Text = Convert.ToString(Y);
    
                Refresh();
            }
    
            private void timer2_Tick(object sender, EventArgs e)
            {
    
                Sekunden.SekDreh +=6;
                X++;
                Refresh();
                 if (X > 60)
                    X = 1;
                label1.Text = Convert.ToString(X);
                Minuten.MinDreh += 6;
                Y++;
                Refresh();
                if (X > 60)
                    X = 1;
                label2.Text = Convert.ToString(Y);
    
     }
            private void label1_Click(object sender, EventArgs e)
            {
    
            }
        }
    }
    [/cs]
    

    Bei diesem Code sieht man nur den Sekundenzeiger und auch nur er bewegt sich, aber richtig.
    Ohne die Zeilen:

    [cs]Sekunden.DrawSekunden(e.Graphics);
    timer2.Start()[/cs]
    

    Sieht man den Minutenzeiger und bewegt sich auch richtig.
    Nur ohne die Zeile

    [cs]Sekunden.DrawSekunden(e.Graphics);[/cs]
    

    Bewegt sich der Zeiger im Takt von dem Sekundenzeiger.

    Ich denke, dass bei RotateTransform alles im PaintEvent gedreht wird, aber komischerweise der Uhrrahmen nicht.
    Gibt es irgendeine Möglichkeit die beiden Zeiger unabhängig voneinander zu sehen und drehen?

    Vielen Dank im Voraus
    mfg



  • Der wird dadurch mitgedreht, da das zweite Rotatetransform noch die Daten des ersten hatte. Du musst zwischen beiden die Transformationsmatrix löschen / resetten.

    Sekunden.DrawSekunden(e.Graphics);
    e.Graphics.ResetTransform();
    Minuten.DrawMinuten(e.Graphics);
    


  • Danke.
    Es hat geklappt


Anmelden zum Antworten