- 日時: 2010/01/19 14:57
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[コントロール共通][マウス][] * * キーワード:MouseEnter,MouseLeave,ボタン上にカーソル,マウスポインター,MouseMove * *********************************************************************************** タイトル : ボタン上からカーソルが外れた判断 記 事 No : 14378 投 稿 日 : 2010/01/15(Fri) 14:48 元質問者 : らっと
ユーザーフォームのボタンにカーソルがのると発生するイベントはMouseMoveですが、 カーソルが外れた時をどう判断したら良いのでしょうか? --------------------------------------------------------------------------------- 記事No : 14379 投稿日 : 2010/01/15(Fri) 16:11 回答者 : 花ちゃん
ボタンのMouseMove イベント(フラグを立て)からユーザーフォームの MouseMove イベントに変わったら(フラグが立っていて)ボタン上からカーソルが外れた事に なりませんか?
と答えたのですが、ボタン1個だけとか配列になっているとかならそれでもいいのですが 色んなコントロール上でも同様にしたいとか、コントロールとコントロールの間隔が狭いと うまく取得できない等の難があり、何かいい方法はないものかと試したのですが、自分的 には今ひとつなのですが、簡単に取得できるような方法が見当たらないので一応参考程度に 投稿しておきます。(いい方法があれば投稿願います。) (サブクラス化やDirectInputや座標位置から取得する方法も検討はしたのですが...。)
------------------------------------------------------------------------ 回答したような方法なら下記でいいのですが。 '.NET 系では、MouseEnter や MouseLeave イベントがありますが。
Private frgCtrl As Boolean 'マウスカーソルがどこにあるかのフラグ Private Sub Form_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If frgCtrl = True Then 'マウスカーソルが Label1 上からForm 上に移動した。 Label1.BackColor = Me.BackColor frgCtrl = False 'マウスカーソルが Form 上にある印 End If End Sub Private Sub Label1_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) frgCtrl = True 'マウスカーソルが Label1 上にある印 Label1.BackColor = vbYellow '視覚化の為 End Sub
------------------------------------------------------------------------ 使用するコントロール類と配置は下図を参照して下さい。 別途、CommandButton の Style プロパティを 1 に設定しておいて下さい。
Option Explicit
'マウスカーソルの位置座標を受取る構造体 Private Type POINTAPI X As Long Y As Long End Type
'現在のマウスカーソルの位置座標を取得する(387) Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINTAPI) As Long
'指定の座標位置にあるウィンドウのハンドルを取得する(106) Private Declare Function WindowFromPoint Lib "user32" _ (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private frgCtrl As Boolean 'マウスカーソルがどこにあるかのフラグ
Private Sub Form_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If frgCtrl = True Then 'マウスカーソルが Label1 上からForm 上に移動した。 Label1.BackColor = Me.BackColor frgCtrl = False 'マウスカーソルが Form 上にある印 End If End Sub
Private Sub Label1_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) frgCtrl = True 'マウスカーソルが Label1 上にある印 Label1.BackColor = vbYellow '視覚化の為 End Sub
'----------------------------------------------------------------------------
Private Sub Command1_Click() Timer1.Interval = 100 Timer1.Enabled = Not Timer1.Enabled End Sub
Private Sub Timer1_Timer() Dim hCtrl As Long Dim Ret As Long Dim Pos As POINTAPI '現在のマウスカーソルの位置座標を取得 Ret = GetCursorPos(Pos) 'その位置のウィンドウのハンドルを取得 hCtrl = WindowFromPoint(Pos.X, Pos.Y) Dim ctrl As Control For Each ctrl In Me.Controls If TypeName(ctrl) = "Label" Or TypeName(ctrl) = "Timer" Then 'ハンドルが取得できないコントロールの場合 '別途取得が必要なら座標位置から割り出し特定するか、個別にコードを '書いて下さい。 Else If ctrl.hWnd = hCtrl Then ctrl.BackColor = vbRed Else ctrl.BackColor = Me.BackColor End If End If Next End Sub
画像をクリックすると元のサイズで見られます。
|