勘の良い方はもう、お気づきでは?
今回はメモ帳に文字列を出力してみましょう。なあに、簡単です。前のページで文字列をクリアするためにエディットボックスに空文字を送りましたね。この空文字の部分をちょっと改造してやれば出来上がりです。 Private Const WM_SETTEXT = &HC '文字列をセットする
'--------------------------------------------------------------- Dim ret As Long
'文字列を出力する OutputText = IIf(ret, 1, 0) End Function 引数が1つ増えただけです。簡単でしょう。さて、コマンドボタン(オブジェクト名:cmdOutputText)を配置して次のコードを書きましょう。 Private Sub cmdOutputText_Click() Call OutputText(hEditbox, "1234567890") End Sub メモ帳を起動し、コマンドボタンをクリックすると、"1234567890"という文字列が出力されるはずです。けれども、2回、3回とクリックしてみてください。常に、"1234567890"が出力されます。どうも、文字列を出力する前にクリアされてしまうようです。これでは、連続して文字列を出力するときに困ってしまいます。さて、どうしたものか、となるところですがラッキーなことに こちら でその方法が紹介済みなのであります。そこで紹介されている関数をそのまま使えばいいのです。 Private Const EM_REPLACESEL = &HC2 '選択文字列を指定文字列で置換する
'------------------------------------------------------------------- Dim ret As Long
'文字列追加 OutputTextEx = IIf(ret, 1, 0) End Function これで、連続して文字列を出力することができるようになりました。けれども、連続で文字列を表示するといっても、文字列は最後尾に追加されるわけではなく、キャレット位置に出力されるのです。試しに、キャレットを移動させて試してみてください。 この関数をもう少し拡張させましょう。文字列の出力位置を、@メモ帳の先頭、Aメモ帳の最後尾、Bキャレット位置 に選択できるようにしましょう。さて、ここでキャレット位置を変更する方法を述べなければなりません。それは、EM_SETSEL メッセージを使用することで実現できます。本来これは、文字列を選択状態にするとき使用するものですが、キャレット位置変更にも使用できます。 SendMessage API関数の第3引数に選択文字開始位置、第4引数には、選択終了文字位置を指定します。さて、キャレットを移動させる処理を書いてみます。
先頭に移動 : Call SendMessage(hEditbox, EM_SETSEL, 0, ByVal 0&) 先頭に移動処理の第3、第4引数に直接0を指定していますが、何故かは分かりますよね。選択する文字位置が0、ということで、キャレットが先頭に来ます。さらに、選択終了文字位置が0なので文字列は選択されず、キャレット位置はそのままの位置に残るというわけです。最後尾に移動の方法も同じ理屈です。 GetEditboxLenB 関数は前のページで作成した、文字列のバイト数を取得する関数です。 さて、関数を組んでみましょう。 Private Const EM_SETSEL = &HB1
'------------------------------------------------------------------- Dim ret As Long
Select Case CaretPos ret = SendMessage(hEditbox, EM_REPLACESEL, 0, ByVal AddString) OutputTextEx = IIf(ret, 1, 0) End Function
|