2015-05-04 162 views
0

我將用60線形狀(使用Visual Studios PowerPack)來創建表單。我希望用戶能夠使用鍵盤上的左和右按鈕旋轉90度的形狀。如何旋轉線形90度?

這樣做的最好方法是什麼?我嘗試了其他方法,但是這相當於1000行代碼,我仍然在學習,我想知道最佳實踐。

非常感謝!

+0

取決於您的線條如何存儲(座標或圖像)。如果你只想翻轉90度,你可以切換x和y。 (順時針還是逆時針?) –

+0

這將有助於查看一些示例代碼,演示如何在窗體上使用至少一行。 –

回答

1

我假設你已經寫過零件來處理幾何圖形,並詢問如何重新使用代碼,而不用重複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

+0

你好,我沒有添加線幾何的任何代碼,抱歉的混亂。如果可能的話,我希望能夠將線90度旋轉到中點。感謝您的幫助,我真的很感激! :) – snipar

+1

這裏值得注意的是,刪除表單的處理代碼中的處理程序非常重要。未刪除的處理程序將固定這些對象並阻止GC。 –

0

或者,你也可以繼承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