0

ラベルで MouseEnter と MousePressed を組み合わせたい。

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 でトリガーされ、ブール変数の値を変更するメソッドを作成することでした。次に、その変数を条件として使用して、変更をラベルに適用します。しかし、それはうまくいかないようです...

どうすればこれを最善の方法で達成できますか? それとも、まったく?

疑似コード: マウスがラベルに入るとき: 左マウスボタンが押された場合、ラベルを操作します

編集:マウスボタンがまだ押されていて、カーソルが複数のラベル上にドラッグされている場合にも機能する必要があります。左ボタンが押されている間にカーソルが交差するすべてのラベルを変更する必要があります。

4

1 に答える 1

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

- - アップデート

前述のように、目的を直接達成することはできませんが、同等のパフォーマンスを実現する方法は多数あります。例えば:

ターゲット ラベルの 1 つがクリックされたかどうかを示すブール値フラグ ( 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

上記のコードを使用すると、任意のラベル (または特定のラベル) をクリックするだけで「編集を有効にする」ことができます。アクティブ化されたら、マウスを任意のラベルの上に置くだけで、アクションが実行されます。また、この動作を無効にするイベントを設定する必要があります (例: 新しいクリック/マウスダウン)。ご覧のとおり、これは必要なものと同等のパフォーマンスを提供し、イベントの動作と互換性があります。

明確化:これ(またはこれらの行の他の代替手段)は優れたパフォーマンスを提供すると思います。それでもそれを望まず、マウスボタンを押したまますべてを実行したい場合は、何か別のものに依存する必要があります (たとえば、画面上のマウスの位置、他の手段によってトリガーされた分析、または別のイベントからのイベントなど)。スレッド)。明らかなことは、異なるコントロールの 1 つのスレッド イベントでは目的を達成できないことです (前のイベントが終了する前に新しいイベントを開始することはできません)。

于 2013-08-02T08:55:28.053 に答える