2016-09-28 24 views
0

これは愚かな質問であれば事前に謝罪してください。VB.NET中心にグラフィックオブジェクトを回転

私は背景を持つパネル上に描画しているイメージを操作するグラフィックスオブジェクトを持っています。私がしたいことは、画像をその中心の周りに回転させることです。

グローバル宣言:

Dim myBitmap As New Bitmap("C:\Users\restofthefilepath") 
Dim g As Graphics 

Form1_Load:

g = Panel1.CreateGraphics 

Timer1_tick(1秒に設定した間隔):

Panel1.Refresh() 
g.DrawImage(myBitmap, -60, 110) 
g.RenderingOrigin = New Point(160, 68) 
g.RotateTransform(10) 

そして は、ここで私が今まで持っていたコードです私はこれを得る:左は最初のダニの後、右は二番目のダニの後である。 enter image description here

(プレースホルダグラフィックス)

あなたは(this answerで示唆されているように)私はRenderingOriginを設定しています見ることができるように:が、回転は0,0の周りにまだあります。私はthis documentationと言っているので、RotateTransform(10,160,68)を実装しようとしましたが、ビルドエラーが発生します。 "アクセス可能な 'RotateTransform'がこの数の引数を受け入れないため、 。

ここで私は間違っています。どのように画像をその中心の周りで回転させるのですか?

+0

ビルドエラーに関しては、Windowsフォームテクノロジを使用しており、そのドキュメントがSystem.Windows.Media(通常はWPFで使用されている)用であるためです。 –

+0

@AndrewMorton WPFを使用してプロジェクトを再構築する以外に、ビルドエラーを解決する方法についてアドバイスをいただけますか? – ForgeMonkey

+0

うーん...あなたは原点を変更して回転*をする前にイメージを描くことを意図していませんか? –

答えて

1

私は新しいVB.NET Windowsフォームプロジェクトを開始しました。 200px x 200pxのPanelとButtonを追加して、必要に応じてアニメーションを一時停止しました。少しあなたのように作られた画像を

enter image description here

:私はパネル1に背景画像を与えた

enter image description here

し、次のコードを使用:

Public Class Form1 

    Dim wiggle As Bitmap 
    Dim tim As Timer 

    Sub MoveWiggle(sender As Object, e As EventArgs) 
     Static rot As Integer = 0 
     Panel1.Refresh() 

     Using g = Panel1.CreateGraphics() 
      Using fnt As New Font("Consolas", 12), brsh As New SolidBrush(Color.Red) 
       ' the text will not be rotated or translated 
       g.DrawString($"{rot}°", fnt, brsh, New Point(10, 10)) 
      End Using 
      ' the image will be rotated and translated 
      g.TranslateTransform(100, 100) 
      g.RotateTransform(CSng(rot)) 
      g.DrawImage(wiggle, -80, 0) 
     End Using 

     rot = (rot + 10) Mod 360 

    End Sub 

    Private Sub bnPause_Click(sender As Object, e As EventArgs) Handles bnPause.Click 
     Static isPaused As Boolean = False 
     If isPaused Then 
      tim.Start() 
      bnPause.Text = "Pause" 
     Else 
      tim.Stop() 
      bnPause.Text = "Start" 
     End If 

     isPaused = Not isPaused 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     wiggle = New Bitmap("C:\temp\path3494.png") 
     wiggle.SetResolution(96, 96) ' my image had a strange resolution 
     tim = New Timer With {.Interval = 50} 
     AddHandler tim.Tick, AddressOf MoveWiggle 
     tim.Start() 

    End Sub 

    Private Sub Form1_Closing(sender As Object, e As EventArgs) Handles MyBase.Closing 
     RemoveHandler tim.Tick, AddressOf MoveWiggle 
     tim.Dispose() 
     wiggle.Dispose() 

    End Sub 

End Class 

をして、これを達成しました:

enter image description here

注1:正しい順序で変換を設定することが重要です。

注2:イベントの使い捨てリソースについて.Dispose()と呼んでいます。これにより、メモリがきれいになり、何もリークしないことが保証されます。

アニメーションを作成するには、間違いなく良い方法がありますが、1秒間に1フレームでこれを実行すると、効果が得られます。

関連する問題