none
Frage zu C# - Windows Forms- Draw.Funktion RRS feed

  • Frage

  • Hallo,

    wie zeichnet man in c# ein Zifferblatt für eine Uhr selbst mit Graphics.

    ich weiß, dass es mit Math.Cos geht und man es berechnen muss, 

    aber weiß nicht wie der Code zusammengesetzt ist :( 

    Montag, 28. April 2014 18:05

Antworten

  • Hallo,
    theoretisch solltest du die trigonometrischen Funktionen irgend wann mal kennen gelernt haben ;)

    Ich will mal nicht so sein und dir einen Ansatz geben:

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        int diameter = 300;//Durchmesser des Ziffernblatts
        int innerDiameter = 200;//Abstand zwichen 2 gegenüber liegenden Strichen
        Point topLeft = new Point(50, 50);//Punkt oben links vom Ziffernblatt
    
        e.Graphics.DrawEllipse(Pens.Black, topLeft.X, topLeft.Y, diameter, diameter);//Außenkreis
    
        for (double i = 0; i < 12; ++i)
        {
            //Für 12 Anstriche
            e.Graphics.DrawLine(Pens.Black,
                (float)Math.Sin(i / 6 * Math.PI) * diameter / 2 + diameter / 2 + topLeft.X,
                (float)Math.Cos(i / 6 * Math.PI) * diameter / 2 + diameter / 2 + topLeft.X,
                (float)Math.Sin(i / 6 * Math.PI) * innerDiameter / 2 + diameter / 2 + topLeft.X,
                (float)Math.Cos(i / 6 * Math.PI) * innerDiameter / 2 + diameter / 2 + topLeft.X);
            //Der 1. Anstrich ist bei 6:00, die Striche verlaufen gegen den Uhrzeigersinn - darum die "komische" ausgabe der Zahl
            e.Graphics.DrawString((12 - (i + 6) % 12).ToString(), SystemFonts.DefaultFont, Brushes.Black,
                (float)Math.Sin(i / 6 * Math.PI) * (diameter + 40) / 2 + diameter / 2 + topLeft.X - 7,
                (float)Math.Cos(i / 6 * Math.PI) * (diameter + 40) / 2 + diameter / 2 + topLeft.X - 7);//Position von der Mitte ausgehend berechnen
        }
    }

    Das Ergebnis sieht so aus:

    Die restlichen Anpassungen (Strichlänge etc.) musst du selbst übernehmen. Was bei der Berechnung genau passiert, kannst du auf Wikipedia (Sinus und Kosinus) nachlesen.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 28. April 2014 18:22
    Moderator

Alle Antworten

  • Hallo,
    theoretisch solltest du die trigonometrischen Funktionen irgend wann mal kennen gelernt haben ;)

    Ich will mal nicht so sein und dir einen Ansatz geben:

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        int diameter = 300;//Durchmesser des Ziffernblatts
        int innerDiameter = 200;//Abstand zwichen 2 gegenüber liegenden Strichen
        Point topLeft = new Point(50, 50);//Punkt oben links vom Ziffernblatt
    
        e.Graphics.DrawEllipse(Pens.Black, topLeft.X, topLeft.Y, diameter, diameter);//Außenkreis
    
        for (double i = 0; i < 12; ++i)
        {
            //Für 12 Anstriche
            e.Graphics.DrawLine(Pens.Black,
                (float)Math.Sin(i / 6 * Math.PI) * diameter / 2 + diameter / 2 + topLeft.X,
                (float)Math.Cos(i / 6 * Math.PI) * diameter / 2 + diameter / 2 + topLeft.X,
                (float)Math.Sin(i / 6 * Math.PI) * innerDiameter / 2 + diameter / 2 + topLeft.X,
                (float)Math.Cos(i / 6 * Math.PI) * innerDiameter / 2 + diameter / 2 + topLeft.X);
            //Der 1. Anstrich ist bei 6:00, die Striche verlaufen gegen den Uhrzeigersinn - darum die "komische" ausgabe der Zahl
            e.Graphics.DrawString((12 - (i + 6) % 12).ToString(), SystemFonts.DefaultFont, Brushes.Black,
                (float)Math.Sin(i / 6 * Math.PI) * (diameter + 40) / 2 + diameter / 2 + topLeft.X - 7,
                (float)Math.Cos(i / 6 * Math.PI) * (diameter + 40) / 2 + diameter / 2 + topLeft.X - 7);//Position von der Mitte ausgehend berechnen
        }
    }

    Das Ergebnis sieht so aus:

    Die restlichen Anpassungen (Strichlänge etc.) musst du selbst übernehmen. Was bei der Berechnung genau passiert, kannst du auf Wikipedia (Sinus und Kosinus) nachlesen.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 28. April 2014 18:22
    Moderator
  • danke sehr lieb... hat mir sehr weitergeholfen 
    Montag, 28. April 2014 18:46
  • Hi,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.

    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Dienstag, 29. April 2014 12:11