カーソル位置の座標変換には、ScreenToClient,ClientToScreen関数を使用します。
Form_MouseMoveやPicture_MouseMove等における、x,yパラメータは、 クライアント座標の値です。そこでスクリーン座標が必要な場合、この ClientToScreen関数を使用して変換します。(これだったら最初から、 GetCursorPos関数を呼び出したほうがいいですね)
逆にスクリーン座標から クライアント座標に変換するのがScreenToClient関数です。(これも、 特に必要なときは少ないですね)
(ScreenToClient,ClientToScreen 関数の使用方法)
フォームのGeneralセクションに次の宣言コードを追加して下さい。
GetCursorPos関数と一緒に使うことが多いので、 [カーソル位置を取得・設定]のコードに追加(太字)します。
フォームにLabelを2つ配置して、Form_MouseMoveプロシージャに次のコード を追加して下さい。
'構造体の定義 Private Type POINT x As Long y As Long End Type 'APIの宣言 'マウスカーソルの現在の位置を、スクリーン座標で取得 Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINT) As Long 'hwnd ウィンドウのハンドルを指定、このクライアント座標が変換される 'スクリーン座標で指定された点の座標を、クライアント座標に変換 Private Declare Function ScreenToClient Lib "user32" _ (ByVal hWnd As Long, lpPoint As POINT) As Long 'クライアント座標で指定された点の座標を、スクリーン座標に変換 Private Declare Function ClientToScreen Lib "user32" _ (ByVal hwnd As Long, lpPoint As POINT) As Long
スクリーン座標を得る以外はパラメータで取得 できるので、それほど重要ではありません。ただ他のAPIで、カーソル の位置をスクリーン座標で指定する場合があるので、必要がないということも ないです。
Private Sub Form_MouseMove(Button As Integer, Shift As _ Integer, x As Single, y As Single) Dim p As POINT Dim msg As String ret = GetCursorPos(p) msg = "スクリーン座標 " & "(" & p.x & "," & p.y & ")" Label1.Caption = msg ret = ScreenToClient(Me.hwnd, p) msg = "クライアント座標 " & "(" & p.x & "," & p.y & ")" Label2.Caption = msg End Sub