1

これは、ここで回答した質問の後続の質問です: How to detect a mouse_down on a Userform Frame while the mouse is still down

その質問に対する回答のコードを使用すると、フォーム上の任意のフレームで MouseDown、MouseUp、および MouseMove を正常に検出できます。ただし、cls で使用できる Frame_Enter または Frame_Exit イベントはないようです。クラス モジュールで Frame_Enter イベントをシミュレートする方法はありますか?

編集:これが私がやろうとしていることです。大きなフレームに結合すると、より大きな画像を構成する 8 つの画像がロードされた 8 つのフレームがあります。長方形のピースが 8 つあるジグソーを考えてみてください。通常、8 つのフレームすべてに「淡色表示」(ニュートラル フィルター オーバーレイ) バージョンの画像が保持されますが、マウスがそれらのいずれかに入ると、新しく入力されたフレームに画像の「非淡色表示」バージョンが読み込まれ、淡色表示されたちょうど終了したフレームの画像のバージョン。したがって、マウスがこれらのフレームのいずれかの上にある場合、マウスは常に暗い画像に囲まれた明るい画像の上を移動しています.

マウスが淡色表示されていないフレームの周りを移動すると、無制限の数の「ホットスポット」トリガーがロールオーバーされ、マウスが現在ホバリングしているものに関する詳細情報を含むテキスト ボックスがポップアップ表示されます。そのフレームを離れて別のフレームに移動すると、プロセスが繰り返されます。

マウスがフレーム境界を越えて次のフレームに移動するタイミングを検出することを除いて、すべてが機能しています。これは、MouseMove イベントを処理する前に検出する必要があります。

他に何も提案されていない場合、有望に見える方法を次に示し ます。

Edit2:まだ有望に見えますが、機能させることはできません。コントロールをクリックするまで、入力イベントと終了イベントを発行していないようです。これは私にとっては役に立ちません。

では、クリス、あなたの話に戻りましょう。Frame_MouseMove イベントを見て、前回とは異なる Frame がイベントを発行するのを待っています。補助的な textBox を使用して変更を通知する代わりに、静的変数を使用して currentFrame/prevFrame を追跡できないかどうか疑問に思っています。

4

2 に答える 2

0

キーワード:シミュレート

フレームMouse_Moveとフォームの組み合わせを使用するMouse_Move

txtWhereAmI(値のプロパティをに初期化するForm
txtEntry txtExit(値のプロパティをに初期化する0)と呼ばれるテキストボックスを使用したデモンストレーション

クラスモジュールでFrameMouseMoveを宣言します

Private Sub Frme_MouseMove( _
 ByVal Button As Integer, _
 ByVal Shift As Integer, _
 ByVal X As Single, _
 ByVal Y As Single)

    UserForm1.txtWhereAmI.Value = Frme.Caption
End Sub

フォームモジュールで、フォームマウスの移動を宣言します

Private Sub UserForm_MouseMove( _
  ByVal Button As Integer, _
  ByVal Shift As Integer, _
  ByVal X As Single, _
  ByVal Y As Single)
    txtWhereAmI.Value = "Form"
End Sub

およびテキストボックス変更イベント

Private Sub txtWhereAmI_Change()
    If txtWhereAmI.Value = "Form" Then
        txtExit = txtExit + 1
    Else
        txtEntry = txtEntry + 1
    End If
End Sub

結果:txtWhereAmIマウスが置かれているフレームを識別し、開始イベントと終了イベントtxtEntrytxtExitカウントします

Changeイベントは、イベントハンドラーtxtWhereAmIの基礎を形成しますEntryExit

于 2012-04-16T00:58:07.603 に答える
0

私は間違っているかもしれませんが、フレームの_Enterandイベントを直接トラップする方法はありません。_Exitただし、代替手段があります

Option Explicit

Dim temp As String

Private Sub UserForm_Initialize()
    temp = "OnForm"
End Sub

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If temp = "OnForm" Then
        Debug.Print "The mouse just entered the frame"
        temp = "OnFrame"
    End If
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If temp = "OnFrame" Then
        Debug.Print "The mouse just exited the frame"
        temp = "OnForm"
    End If
End Sub
于 2012-04-15T22:21:22.670 に答える