この機能があると便利なんだよね。
処理は基本的に簡単です。1つ前のページで紹介した指定行の先頭の文字列位置を取得する関数より、指定した行の先頭文字位置を取得します。あとはキャレットをその位置に設定してあげればいいだけです。キャレットを指定位置に動かすには、EM_SETSEL を使用すればよかったですね。詳しくはこちらをご覧ください。そうと分かれば関数を書いてみましょう。簡単なエラー処理も付けておきます。
'----------------------------------------------------------------
' 関数名 : MoveCaret
' 機能 : 指定された行へキャレットを移動する
' 引数 : (in) hEditbox … メモ帳のエディットボックスのハンドル
' (in) MoveLineNum … 指定行
' 戻り値 : 正常終了…0 パラメーターエラー… -1
'----------------------------------------------------------------
Public Function MoveCaret(ByVal hEditbox As Long, ByVal MoveLineNum As Long) As Long
Dim TotalLines As Long 'テキストボックスの総行数
Dim LineIndex As Long '指定行の先頭の文字位置
'テキストボックスの総行数を取得
TotalLines = GetTotalLine(hEditbox)
MoveLineNum = MoveLineNum - 1
'テキストボックスの総行数より指定行が大きければエラー
If MoveLineNum > TotalLines - 1 Then
MoveCaret = -1
Exit Function
End If
'0より値が小さければ無条件に1行目に設定
If MoveLineNum < 0 Then MoveLineNum = 0
'指定行の先頭の文字位置を取得する
LineIndex = GetTopPosOfLine(hEditbox, MoveLineNum)
'キャレットをセット
Call SendMessage(hEditbox, EM_SETSEL, LineIndex, ByVal LineIndex)
'キャレット位置にスクロールさせる
Call SendMessage(hEditbox, EM_SCROLLCARET, 0&, ByVal 0&)
End Function
以上です。この関数を応用すれば、最後に編集した位置へジャンプという便利な機能も作れることでしょう。
|