テキストボックスでクリックされた位置の文字位置を調べるには

テキストボックスでクリックされた位置の文字位置を調べてみます。
キーワードは「EM_CHARFROMPOS」メッセージです。
EM_CHARFROMPOSメッセージはクライアント座標を与えて文字位置を調べるメッセージです。
プログラムではGetCursorPos()関数を使ってマウスカーソルのスクリーン座標を取得し
ScreenToClient()関数でスクリーン座標をクライアント座標に変換しています。

実行時の様子

Private Type POINTAPI
    x As Long
    y As Long
End Type
'カーソルの現在のスクリーン座標の取得
Private Declare Function GetCursorPos Lib "user32.dll" _
    (lpPoint As POINTAPI) As Long
'点座標をスクリーン座標からクライアント座標に変換する
Private Declare Function ScreenToClient Lib "user32.dll" _
        (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
'指定のウィンドウにメッセージを送る
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
    (ByVal hWnd As Long, ByVal MSG As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
'テキストボックスのメッセージ
Private Const EM_CHARFROMPOS = &HD7               'クライアント座標を指定して、

'その位置に最も近い文字インデックスを取得する Private Function MAKELONG(ByVal LowWord As Integer, ByVal HighWord As Integer) As Long '下位・上位ワードを与えて長整数値(32ビット値)を取得する MAKELONG = (LowWord And &HFFFF&) Or (HighWord * &H10000) End Function
Private Function HWORD(ByVal LongValue As Long) As Integer '長整数値から上位ワードを取得する HWORD = (LongValue And &HFFFF0000) \ &H10000 End Function
Private Function LWORD(ByVal LongValue As Long) As Integer '長整数値から下位ワードを取得する If (LongValue And &HFFFF&) > &H7FFF Then LWORD = (LongValue And &HFFFF&) - &H10000 Else LWORD = LongValue And &HFFFF& End If End Function
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Dim lpPoint As POINTAPI, rc As Long 'クリックされた位置を取得する Call GetCursorPos(lpPoint) 'マウス位置を取得 Call ScreenToClient(Me.Text1.hWnd, lpPoint) 'クライアント座標に変換 Me.Label5(0).Caption = lpPoint.x Me.Label5(1).Caption = lpPoint.y rc = SendMessage(Me.Text1.hWnd, EM_CHARFROMPOS, 0, MAKELONG(CInt(lpPoint.x), CInt(lpPoint.y))) lpPoint.x = LWORD(rc) + 1 '文字インデックス lpPoint.y = HWORD(rc) + 1 '行数 Me.Label2(0).Caption = lpPoint.x Me.Label2(1).Caption = lpPoint.y End Sub
ダウンロード