采纳本回答,留下email,发给你完整代码
使用我的程序,只要填加一个类和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