0

ボタンとしてクリック可能なピクチャボックスを持つ userControl (.NET 1.1 Winforms) があります。

同時に多くのユーザーコントロールが表示されているので、マウスがユーザーコントロールの上にあるときにピクチャボックスを表示し、それ以外の場合は非表示にするといいと思いました。

そのために、UserControl の MouseEnter イベントと MouseLeave イベントを処理し、ピクチャ ボックスを表示または非表示にします。それはうまくいきます。

しかし、クリッカブル ピクチャ ボックスが表示されると、クリックできなくなります (ハンド カーソルがなくなり、クリック イベントが発生しません)。

いくつかのテストの後、MouseLeave ハンドラーのすべてのコンテンツにコメントを付けて、ピクチャ ボックスで何かを行うと、ピクチャ ボックスがクリック可能になることがわかりました。

正しいイベントを使用していませんか?

これを達成する別の方法はありますか?

これがコードです...

Private Sub NodoEstablo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.pictAdd.Visible = False 
End Sub


Private Sub NodoEstablo_MouseEnters(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter        
    Me.pictAdd.Visible = True
End Sub

問題のあるイベント ハンドラー:

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
    Me.pictAdd.Visible = False
End Sub

更新: MouseLeave でピクチャボックスのサイズを変更すると (何かをするためだけに) 動作します。これまでのところ、MouseLeave で Visible と Location を変更すると、ピクチャ ボックスをクリックできなくなりました。:S

4

1 に答える 1

7

マウスがボタンの上に移動すると、次のようなことが起こります。

  1. マウスはユーザー コントロールを離れ (コントロール内にあるにもかかわらず)、ピクチャ ボックスに入ります。
    • イベントハンドラーMouseLeaveが起動し、ピクチャ ボックスが非表示になります
  2. ピクチャボックスが表示されないため、マウスはピクチャボックスを離れてユーザーコントロールに入ります
    • イベントハンドラMouseEnterが起動し、ピクチャ ボックスが表示されます
  3. ピクチャボックスが表示されるようになったので、プロセスは最初からやり直します

コードをテストしたところ、「ボタン」は継続的にちらつき (表示が切り替えられ続けたため)、クリックを登録するのに十分な時間表示を維持できませんでした。

これに対処する 1 つの方法は、MouseLeavesハンドラーを次のように変更することです。

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, _
                                    ByVal e As System.EventArgs) _
                                    Handles MyBase.MouseLeave
    If Not ClientRectangle.Contains(PointToClient(Cursor.Position)) Then
        Me.pictAdd.Visible = False
    EndIf
End Sub

これは、ボタンを非表示にする前に、マウスが実際にコントロールを離れたことを確認します。

ピクチャボックスのサイズを変更すると、上記のサイクルが壊れた可能性がありますが、根本的な問題には対処できません。

考慮すべきその他の事項(質問とは関係ありません)を次に示します。

  • OnMouseLeaves対応するイベントをサブスクライブするのではなく、ユーザー コントロールの , etc メソッドをオーバーライドすることをお勧めします。
  • このようにコントロールを処理すると、誰かがキーボードのみでアプリケーションを使用できなくなる可能性があることに注意してください。(つまり、ユーザーはTabボタンを押して を押すことはできませんEnter)
于 2009-03-22T19:09:26.173 に答える