none
Zentirert Routieren RRS feed

  • Frage

  • Hallo zusammen,
    ich habe einen Code in meinen Büchern gefunden. Damit kann ich eine Graphik erstellen und diese dann im Kreis routieren lassen.
    Soweit so gut. Aber das dinge dreht sich nicht im Kreis wie zum Beispiel eine Uhr. Also der Mittelpunkt soll gleich bleiben und das Bild soll sich um 360Grad im Kreis drehen. An diesem Beispiel kann ich probieren was ich will. Es geht einfach nicht.

    Welchen Code muss ich denn nehemen ? Also so das sich ein Bild im Kreis dreht ohne den mittelpunkt zu verändern.

    habe micht vertan. das war eine Beispiel hier aus msdn. ich glaube von Elmar oder Thorsten.
    Public Class Form1
    
        ' PictureBox1 Paint 
    
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    
            Dim f As Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Bold)
    
            e.Graphics.DrawString("DeinText", f, Brushes.Black, New Point(5, 5))
    
            Dim m As New Drawing2D.Matrix
    
            m.RotateAt(-70, New PointF(CSng(f.Height / 1.1), 50))
    
            e.Graphics.Transform = m
    
            e.Graphics.DrawString("DeinText", f, Brushes.Black, -50, 50)
    
        End Sub
    
    End Class
    
    
    vielen lieben dank
    bernd
    Montag, 1. März 2010 18:38

Antworten

  • Hallo Bernd,

    unter GDI+ Graphics Transformation findest Du verschiedene Beispiele
    zu den Möglichkeiten von GDI+. Der Code ist zwar C#, aber in den
    meisten Fälle brauchst Du nur das ";" entfernen.

    Listing 10.9 Rotating graphics objects zeigt eine einfache Rotation von beliebigen Objekten.
    Das kann auch ein Bild sein, dass man mit Graphics.DrawImage zeichnet.
    Schau Dir aber auch die anderen Seiten an.

    Kleiner Codeschnippsel:
        Private _angle As Single = 0.0F ' Wird durch Timer verändert...
        Private _image As Bitmap ' das Bildchen
    
        Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Me._image = My.Resources.Falter
            Me._image.MakeTransparent(Color.Magenta)
    
            Me.Timer1 = New Timer()
            Me.Timer1.Interval = 500
            Me.Timer1.Start()
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Me._angle += 2.0F
            If Me._angle >= 360.0F Then
                Me._angle = 0
            End If
            Me.PictureBox1.Invalidate()
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) _
            Handles PictureBox1.Paint
            Dim clientRectangle As Rectangle = DirectCast(sender, PictureBox).ClientRectangle
    
            Dim state As Drawing2D.GraphicsState = e.Graphics.Save()
            Using m As New System.Drawing.Drawing2D.Matrix()
                Dim center As New PointF(clientRectangle.Width / 2.0F, clientRectangle.Height / 2.0F)
                m.RotateAt(Me._angle, center, System.Drawing.Drawing2D.MatrixOrder.Append)
                m.Translate(0.5F, 0.5F)
                e.Graphics.Transform = m
                e.Graphics.DrawImage(Me._image, clientRectangle)
    
                e.Graphics.Restore(state)
            End Using
        End Sub
    

    Gruß Elmar
    Dienstag, 2. März 2010 09:24
    Beantworter

Alle Antworten

  • Hallo Bernd,

    unter GDI+ Graphics Transformation findest Du verschiedene Beispiele
    zu den Möglichkeiten von GDI+. Der Code ist zwar C#, aber in den
    meisten Fälle brauchst Du nur das ";" entfernen.

    Listing 10.9 Rotating graphics objects zeigt eine einfache Rotation von beliebigen Objekten.
    Das kann auch ein Bild sein, dass man mit Graphics.DrawImage zeichnet.
    Schau Dir aber auch die anderen Seiten an.

    Kleiner Codeschnippsel:
        Private _angle As Single = 0.0F ' Wird durch Timer verändert...
        Private _image As Bitmap ' das Bildchen
    
        Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Me._image = My.Resources.Falter
            Me._image.MakeTransparent(Color.Magenta)
    
            Me.Timer1 = New Timer()
            Me.Timer1.Interval = 500
            Me.Timer1.Start()
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Me._angle += 2.0F
            If Me._angle >= 360.0F Then
                Me._angle = 0
            End If
            Me.PictureBox1.Invalidate()
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) _
            Handles PictureBox1.Paint
            Dim clientRectangle As Rectangle = DirectCast(sender, PictureBox).ClientRectangle
    
            Dim state As Drawing2D.GraphicsState = e.Graphics.Save()
            Using m As New System.Drawing.Drawing2D.Matrix()
                Dim center As New PointF(clientRectangle.Width / 2.0F, clientRectangle.Height / 2.0F)
                m.RotateAt(Me._angle, center, System.Drawing.Drawing2D.MatrixOrder.Append)
                m.Translate(0.5F, 0.5F)
                e.Graphics.Transform = m
                e.Graphics.DrawImage(Me._image, clientRectangle)
    
                e.Graphics.Restore(state)
            End Using
        End Sub
    

    Gruß Elmar
    Dienstag, 2. März 2010 09:24
    Beantworter
  • Ok super,

    nun habe ich einen ansatz und kann mich damit beschäftigen.

    vielen lieben dank
    bernd 

    habe es ausprobiert, genau so habe ich mir das vorgestellt. nun kann ich experimentieren und komme auch mit anderen übunfen weiter vorran.

    nochmals lieben dank
    bernd

    Dienstag, 2. März 2010 16:27