2013-08-02 22 views
0

我想將MouseEnter與MousePressed結合在標籤上。在VB.NET標籤上結合mouseEvents

Public Sub populateGrid() 
    lblTest.BackColor() 
    lblTest.BackColor = System.Drawing.Color.Red 
    gbWorkflow.Controls.Add(lblTest) 
    For j As Integer = 1 To 40 
     For i As Integer = 1 To 20 
      Dim L As New Label 
      L.Size = New Size(30, 30) 
      L.Text = "L:" + i.ToString + j.ToString 
      L.BackColor = Color.AliceBlue 
      Dim x, y As Integer 
      Dim loc As Point = gbWorkflow.Location 
      y = loc.Y * (i * 8) '- (gbWorkflow.Height + L.Size.Height) * i 
      x = loc.X * (j * 8) 

      L.Location = New Point(x, y) 

      gbWorkflow.Controls.Add(L) 

      AddHandler L.MouseEnter, AddressOf L_Enter 
      AddHandler L.MouseLeave, AddressOf L_Leave 
     Next 
    Next 
End Sub 
Private Sub L_Enter(ByVal sender As Object, ByVal e As System.EventArgs) 

     Dim TheLabel As Label = CType(sender, Label) 
     TheLabel.BackColor = Color.Red 

End Sub 

我的想法是創建一個觸發器上的MouseDown和改變布爾變量的值的方法。然後,我會使用該變量作爲條件將更改應用於標籤。但是,這似乎並沒有工作...

我如何以最佳方式實現這一目標?或者,根本?

僞代碼: 當鼠標輸入標籤:如果按下左mousebutton然後 做的東西與標籤

編輯: 它也有當mousebutton仍然按光標拖動到工作在幾個標籤。應該改變按下左按鈕時光標交叉的所有標籤。

+0

我在編輯之前做過答案。關於您的編輯:當您按Label1上的按鈕時,按鈕事件與此Label1相關聯。如果你沒有釋放按下並移動鼠標;移動鼠標事件進入圖片(也與Label1關聯)。如果您想通過按下鼠標來影響其他控件,則必須依賴拖放式事件。即使在這種情況下,您也不能在「解壓按鈕」之前將新標籤貼到圖片上(什麼會「解鎖前一個事件」)。請讓你的想法更清楚,並儘量不要突然改變這個問題:) – varocarbas

+0

我真的很抱歉沒有更清楚我想要達到什麼目標!我在一個groupbox(gbWorkFlow)中製作一個標籤網格。這個網格中的標籤應該是可標記的,並且應該可以通過點擊和拖動來標記它們。網格的X軸是日期,Y軸是百分比。用戶應該能夠在選擇適用於每個日期的百分比的日期間畫一條線,而不必單獨點擊每個標籤。這條線並不總是一條直線,這就是我試圖使這個解決方案起作用的原因。這是否澄清了我的問題? – TM89

+0

從你說什麼,你在找什麼是:第一次點擊標籤(如我的原始答案建議...用戶不需要保持鼠標不變),移動到標籤2和一個新的點擊(設置一個新點)等等...(這就是繪圖工具通常如何工作的原因:儘可能多的點擊來繪製線條)。我已經用一個新的示例代碼編輯了我的答案(在閱讀你的解釋之前):看看它並讓我知道你的想法。 – varocarbas

回答

1

MouseDown事件提供了您所追求的內容。示例代碼:

Private Sub L_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) 
    If (e.Button = Windows.Forms.MouseButtons.Left) Then 
     'Do stuff 
    End If 
End Sub 

添加事件處理程序:

AddHandler L.MouseDown, AddressOf L_MouseDown 

--- UPDATE

至於說,你不能直接與你想要什麼,但還有許多其他的方法來提供等效的實現性能。例如:

指示是否已單擊某個目標標籤的布爾標誌(MouseDown)+ MouseEnter僅當此標誌爲true時才執行修改。示例代碼:

Private LWasClicked As Boolean = False 


Private Sub L_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) 
    If (e.Button = Windows.Forms.MouseButtons.Left And Not LWasClicked) Then 
     LWasClicked = True 
    End If 
End Sub 

Private Sub L_MouseEnter(sender As Object, e As System.EventArgs) 
    If (LWasClicked) Then 
     'Do stuff 
    End If 
End Sub 

使用上面的代碼,只需單擊任何標籤(或特定的標籤)即可「激活編輯」;一旦它被激活,你可以將鼠標移到任何標籤上並執行操作。您還必須設置一個事件來取消激活此行爲(例如:新的Click/MouseDown)。正如你所看到的,這提供了與你想要的相同的性能,並且與事件的工作方式相兼容。

澄清:我認爲這個(或這些線上的任何其他替代方案)可以提供出色的性能。如果你仍然不願意,並且喜歡按下鼠標按鈕來完成所有操作,那麼你將不得不依賴於不同的東西(例如,鼠標在屏幕上的位置,通過其他方式觸發的分析;甚至是來自不同的事件線程)。很明顯的是,你的目標不能通過不同控制的單線程事件來完成(新事件在前一個事件結束之前無法啓動)。

+0

對不起,不得不編輯這個問題。您的答案完美無缺,但不適用於多個標籤 – TM89

+0

@ TM89我現在已發佈評論給您的編輯。請仔細想想你想要什麼(並且我會相應地更正我的答案)並記住最小條件:在前一個結束之前不能調用新事件(在這種情況下,必須釋放鼠標點擊/ MouseDown事件終止)。 – varocarbas