Labelを90度回転させてデザイナーに貼り付けたい

タグの編集
投稿者 zz6989  (社会人) 投稿日時 2012/1/19 21:29:48
いつもお世話になっております。
超簡単な機械加工用のCADのプログラムを作成していますが、普通CADの図面の場合、寸法は見る方向に向けて数字が記入されていますので、私もそれにならってLabelを使用して数字を横向きに表示したり、斜めに表示したりしようと思っていますが、いろいろ調べましたがどうしてもその方法がわかりません。
 ちょうどWinsowsのフォトギャラリーとかムービーメーカーの回転ボタンで90度回転させるような感じで数字を90度回転させて表示したいのですが。
 入門レベルの知識しかありませんので、できれば簡単な方法を教えて頂きたいのですが、よろしくお願いします。
 
投稿者 るきお  (社会人) 投稿日時 2012/1/19 23:22:58
Window フォーム アプリケーションを作っているという前提を置きますね。
三角関数の計算が私には難しいので、計算が簡単な角度90度、180度、270度のサンプルを作ってみました。(つまり、斜めにはできません。)
これでも、ラベルは横長なので、「ABCDEFG」のような長い文字を90度回転させると大部分がLabelからはみ出してしまいます。つまり、Label自体を回転させているのではなく、Labelの中身を回転させています。
(WPFならLabelごと回転できます。)

まず、下の状態で一度実行して、すぐ終了させます。
そうするとツールボックスにFlipLabelというコントロールが追加されるのでフォームに配置します。
Public Class Form1
End Class

Public Class FlipLabel
    Inherits Label

    Public Sub Flip0()
        Me.Degree = 0
    End Sub
    Public Sub Flip90()
        Me.Degree = 90
    End Sub

    Public Sub Flip180()
        Me.Degree = 180
    End Sub

    Public Sub Flip270()
        Me.Degree = 270
    End Sub

    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)

        Dim offsetX As Integer
        Dim offsetY As Integer
        Select Case Degree
            Case 90
                offsetX = (e.Graphics.MeasureString(Me.Text, Me.Font)).Width
            Case 180
                offsetX = (e.Graphics.MeasureString(Me.Text, Me.Font)).Width
                offsetY = (e.Graphics.MeasureString(Me.Text, Me.Font)).Height
            Case 270
                offsetY = (e.Graphics.MeasureString(Me.Text, Me.Font)).Height
        End Select

        e.Graphics.TranslateTransform(offsetX, offsetY)
        e.Graphics.RotateTransform(degree)
        e.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), New Point(0, 0))

    End Sub

    Private degreeValue As Single
    Protected Property Degree As Single
        Get
            Return degreeValue
        End Get
        Set(value As Single)
            degreeValue = value
            Invalidate()
        End Set
    End Property

End Class


次に、フォームにボタンを3つ配置して以下のとおりプログラムします。
Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        FlipLabel1.Flip90()
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        FlipLabel1.Flip180()
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        FlipLabel1.Flip270()
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        FlipLabel1.Text = "58"
    End Sub
End Class


実行してボタンを押すと内容が90度、180度、270度の向きに変わります。
プログラムの中身は再計算が多くてちょっと効率が悪いので、パフォーマンスが気になるようなら一度計算した値を使いまわすようにすれば若干向上すると思います。


参考:WPFの場合、次のように簡単にLabel自体を回転できます。
以下は50度回転させる例です。
Label1.RenderTransform = New RotateTransform(50)


こういった表現力はWPFが有利ですね。
投稿者 zz6989  (社会人) 投稿日時 2012/1/20 06:24:20
おはようございます。早速のお返事ありがとうございます。
今日はこれから、出勤ですので詳しく見ることができないので、帰宅後にもう1度返信させてください。
勝手言って申し訳ありません。
投稿者 ZZ6989  (社会人) 投稿日時 2012/1/20 22:26:23
こんばんは、情報不足ですいません。るきお先生のおっしゃるとうりWindow フォーム アプリケーションを選択しています。それとバージョンはVB2010EXPRESSです。
 いつも親切なお返事有難う御座います。
 今計画しているCADはJISのボルトの図面を出力するもので、ねじの呼び径と長さを入力するとボルトの詳細寸法が表示されるもので、90度回転させる部分が3箇所ありますが、そのうち1箇所は通常の向きでも可なので、2箇所のみ90度回転させようと思います、但し1箇所は数字がカンマを含めて4文字ありますのでここは90度回転のLabelを2個くっつけてカバーしようと思います。
  先生の講座でコントロールを作る方法がどこかに出ていましたが、今回先生が書いてくださったプログラムは私には難解ですが、いずれ理解できるときがくると思いますので、今回はこのまま使わせて頂こうと思います。
  WPFは全然わかりませんのでこちらはパスしたいと思います。(VB中学校のようなわかりやすい教科書が見当たりません)
 これからもよろしくお願いします。有難う御座いました。