vb.net 如何让label中的文字旋转90°显示呢?

Public Class MyLabel

Inherits Label   

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 

    e.Graphics.RotateTransform(45)

    e.Graphics.DrawEllipse(New Pen(Color.Red), New Rectangle(2, 2, 10, 10))

 MyBase.OnPaint(e)

    End Sub

    End Class

以上代码只能绘制一个label,并不能旋转90°,如何实现90°旋转呢??


采纳本回答,留下email,发给你完整代码

其他人需要,可以从 https://download.csdn.net/download/caozhy/11126264 下载

图片说明

使用我的程序,只要填加一个类和FormLoad/Closing少量代码,把你label的名字前缀设置为vlbl开头,运行的时候自动旋转。不需要单独设置,不需要新控件


Public Class Form1

    Private sclist As New List(Of SubClassing)

    Private Const WM_PAINT As Integer = &HF

    Private Sub sc_CallBackProc(ByVal h As IntPtr, ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_PAINT
                Dim l As Label = Controls.OfType(Of Label).First(Function(x) x.Handle = h)
                If Not (l Is Nothing) Then
                    Dim g As Graphics = l.CreateGraphics()
                    g.FillRectangle(New SolidBrush(l.BackColor), 0, 0, l.Width, l.Height)
                    Dim mat = g.Transform
                    Dim rmat = g.Transform
                    rmat.RotateAt(90, New PointF(l.Width / 2, l.Height / 2))
                    g.Transform = rmat
                    g.DrawString(l.Text, l.Font, Brushes.Black, New PointF(0, 0))
                    g.Transform = mat
                End If
        End Select
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        For Each item As SubClassing In sclist
            item.ReleaseHandle()
        Next
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each l As Label In Controls.OfType(Of Label)()
            If l.Name.StartsWith("vlbl") Then
                With l
                    l.AutoSize = False
                    l.Size = New Size(l.Size.Width, l.Size.Width)
                    Dim sc As SubClassing = New SubClassing(l.Handle)
                    sc.SubClass = True
                    AddHandler sc.CallBackProc, AddressOf sc_CallBackProc
                    sclist.Add(sc)
                End With
            End If
        Next
    End Sub
End Class

'来自 https://www.codeproject.com/articles/3234/subclassing-in-net-the-pure-net-way

Public Class SubClassing
    Inherits System.Windows.Forms.NativeWindow

    'Event Declaration. This event will be raised when any  
    'Message will be posted to the Control
    Public Event CallBackProc(ByVal hwnd As IntPtr, ByRef m As Message)

    'Flag which indicates that either Event should be 
    'raised or not
    Private m_Subclassed As Boolean = False

    'During Creation of Object of this class, Pass the Handle 
    'of Control which you want to SubClass
    Public Sub New(ByVal handle As IntPtr)
        MyBase.AssignHandle(handle)
    End Sub

    'Terminate The SubClassing
    'There is no need to Create this Method. Cuz, 
    'when you will create the Object
    'Of this class, You will have the Method Named ReleaseHandle.
    'Just call that as you can see in this Sub

    'Public Sub RemoveHandle()
    '    MyBase.ReleaseHandle()
    'End Sub

    'To Enable or Disable Receiving Messages
    Public Property SubClass() As Boolean
        Get
            Return m_Subclassed
        End Get
        Set(ByVal Value As Boolean)
            m_Subclassed = Value
        End Set
    End Property

    Protected Overrides Sub WndProc(ByRef m As Message)
        If m_Subclassed Then 'If Subclassing is Enabled 
            MyBase.WndProc(m)
            RaiseEvent CallBackProc(MyBase.Handle, m) 'then RaiseEvent
        End If
    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub
End Class

VB编程小例子,让字符或文字旋转显示,可设置文本倾斜度(旋转角度),设置字体参数,VB代码里还有更多的设置参数:比如:
   '设置字符高度
   RF.lfWidth = 10
   '设置字符平均宽度
   RF.lfEscapement = 0
   '设置文本倾斜度
   RF.lfWeight = 400
   '设置字体的轻重
   RF.lfItalic = 0
   '字体不倾斜
   RF.lfUnderline = 0
   '字体不加下划线
   RF.lfStrikeOut = 0
   '字体不加删除线
   RF.lfOutPrecision = 0
   '设置输出精度
   RF.lfClipPrecision = 0
   '设置剪辑精度
   RF.lfQuality = 0
   '设置输出质量
   RF.lfPitchAndFamily = 0
   '设置字体的字距和字体族
   RF.lfCharSet = 0
   '设置字符集
   RF.lfFaceName = "Arial" + Chr(0)
   '设置字体名称图片说明