tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
マウスがボタン上にある時にボタンのバックカラーを変更する(VB6.0) ( No.0 )  [親スレッドへ]
日時: 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


画像をクリックすると元のサイズで見られます。



 [スレッド一覧へ] [親スレッドへ]