我將用60線形狀(使用Visual Studios PowerPack)來創建表單。我希望用戶能夠使用鍵盤上的左和右按鈕旋轉90度的形狀。如何旋轉線形90度?
這樣做的最好方法是什麼?我嘗試了其他方法,但是這相當於1000行代碼,我仍然在學習,我想知道最佳實踐。
非常感謝!
我將用60線形狀(使用Visual Studios PowerPack)來創建表單。我希望用戶能夠使用鍵盤上的左和右按鈕旋轉90度的形狀。如何旋轉線形90度?
這樣做的最好方法是什麼?我嘗試了其他方法,但是這相當於1000行代碼,我仍然在學習,我想知道最佳實踐。
非常感謝!
我假設你已經寫過零件來處理幾何圖形,並詢問如何重新使用代碼,而不用重複60行。這很重要,因爲從圍繞中點或圍繞起點旋轉的問題來看,並非100%清楚,因爲LineShape類型確實區分了開始點和結束點。沒有這些信息,我無法爲您編寫幾何代碼。
第一部分並沒有那麼糟糕。我們只是設置了幾個方法,可以處理旋轉任何行:
'Note that rotating a line 90 degrees around it's midpoint
' will give the same result whether you go clockwise or counterclockwise,
' but I figure you'll want to adapt this for other shapes later, or that
' you're rotating around the line's starting point
Private Sub RotateClockwise(ByVal line As LineShape)
'Code to rotate the passed line clockwise here
Dim x1 As Integer = line.X1
Dim y1 As Integer = line.Y1
Dim x2 As Integer = line.X2
Dim y2 As Integer = line.Y2
End Sub
Private Sub RotateCounterclockwise(ByVal line As LineShape)
'Code to rotate the passed line counter-clockwise here
End Sub
Private Sub LineShape_KeyDown(Byval sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
'Which line?
Dim line As LineShape = TryCast(sender, LineShape)
If line Is Nothing Then Exit Sub
'Left key?
If e.KeyCode = Keys.Left Then RotateCounterclockwise(line)
'Right key?
If e.KeyCode = Keys.Right Then RotateClockwise(line)
End Sub
這是它變得棘手。請注意,上述事件處理程序缺少Handles
關鍵字。我們希望將事件處理程序所有的LineShape控件連接到這一個方法。這將是一個有點重複,因爲這意味着你的形式在每一行代碼的另一行,但它是不是需要編寫上面的代碼你行的所有更好:
Dim Lines As New List(Of LineShape)()
Lines.Add(LineShape1)
Lines.Add(LineShape2)
'...
Lines.Add(LineShape60)
For Each Line As LineShape In Lines
AddHandler Line.KeyDown, AddressOf LineShape_KeyDown
Next
該代碼去在你的表格的構造函數之後的InitializeComponent()
方法。
我可以做的更好,如果線形類型是一個真正的控制(For EAch Line In Me.Controls.OfType(Of LineShape)()
),但該文檔顯示這其實是一個Component
,而不是Control
。
你好,我沒有添加線幾何的任何代碼,抱歉的混亂。如果可能的話,我希望能夠將線90度旋轉到中點。感謝您的幫助,我真的很感激! :) – snipar
這裏值得注意的是,刪除表單的處理代碼中的處理程序非常重要。未刪除的處理程序將固定這些對象並阻止GC。 –
或者,你也可以繼承LineShape
建設「可旋轉」到您的新類爲:
Imports Microsoft.VisualBasic.PowerPacks
Public Class MySmartLine
Inherits LineShape
Private Sub RotateClockwise()
'Code to rotate clockwise here
Me.X1 = ...
Me.X2 = ...
End Sub
Private Sub RotateAntiClockwise()
'Code to rotate anti clockwise here
End Sub
Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
MyBase.OnKeyDown(e)
If e.KeyCode = Keys.Left Then
RotateAntiClockwise()
End If
If e.KeyCode = Keys.Right Then
RotateClockwise()
End If
End Sub
End Class
建設項目後,自定義MySmartLine
組件將出現在你的工具箱,你可以代替使用LineShape
。
取決於您的線條如何存儲(座標或圖像)。如果你只想翻轉90度,你可以切換x和y。 (順時針還是逆時針?) –
這將有助於查看一些示例代碼,演示如何在窗體上使用至少一行。 –