TextBoxにフォーカスがあり、そのBoxのキャレットのある位置を先頭位置からではなく、その行の先頭から何文字目か(桁)を調べるAPIまたは高速に動作するプログラムを探しています。
まあ、VBの上のほうに行と桁を表示するアレです。
私は下記のようなプログラムを組みました。(一部省略)
'******************************
'マウスカーソル位置の文字数(行の先頭から桁数)を取得
Dim Count As Long
Dim strLin As String
'総行数を取得する
MaxRow = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
'現在行(マウスカーソル位置の)を取得する
PosRow = SendMessage(Text1.hwnd, EM_LINEFROMCHAR, -1&, 0&) + 1
'現在行の先頭位置までのバイト数(vbFromUnicode)を取得
CurPos = SendMessage(Text1.hwnd, EM_LINEINDEX, -1&, 0&)
'現在位置までのバイト数を取得
PosCol = SendMessage(Text1.hwnd, EM_GETSEL, 0&, 0&) \ 65536
'行の先頭からのバイト数を求める
PosCol = PosCol - CurPos
If PosCol < 0 Then
PosCol = PosCol + 65535
End If
'先頭からの文字列を求める
strLin = Left$(Text1.Text, Text1.SelStart)
'IME入力時はこの処理ができない
'バイト数でカウントするならこの処理及びキー制限はいらない
For Count = 0 To Len(strLin)
'先頭位置と同じバイト数になるまで文字数をカウント
If CurPos = LenB(StrConv(Left$(strLin, Len(strLin) - Count), vbFromUnicode)) Then
PosCol = Count + 1
Exit For
End If
Next Count
'******************************
そしてPosColを読めばOKですが、だめです。
これはとても遅く、またFOR文を抜かすと数千行目でバグって使えません。
変数はLong型を使っています。
どこからでも読み出したかったので、モジュールの中に定義しています。
SendMessage などAPIも同じです。
> FOR文を抜かすと数千行目でバグって使えません。
wParam,lParamの意味をきちんと調べることをおすすめします。
戻り値を使ったのでは簡単にオーバーフローします。
ここの過去ログにもあるはずです。
去年の8月ごろ回答した記憶あるし・・・。
ありがとうございました。
返り値は、ほぼ65535倍くらいされて帰ってくるので、オーバフローするの当たり前ですね。(^_^;)
無事解決する事が出来ました。皆さんありがとう。
ツイート | ![]() |