エディットボックスについて †


エディットボックスは文字や数字を入力できるコントロール
作られた直後は32KBまで編集可能
EM_SETLIMITTEXTメッセージを使うと最大で2GBか4GBまで増やせるが、9x系のOSだと64KBまでという制限がある


エディットボックスのスタイル †


RADで変更できるエディットボックスのスタイルについて
  • 無効(使用不可)
入力エリアが灰色になって入力フォーカスを受け付けないが、Set、GetWindowTextは普通に使える
  • 可視
チェックしておかないとエディットボックスが見えない
グループ
グループボックス?を参照
タブストップ
加筆plz
複数行
複数行のテキストが扱えるようになる
水平スクロールバー、垂直スクロールバー、垂直オートスクロールのスタイルが使用可能になる
パスワードスタイルは使えない
番号
数字以外入力できなくなる
水平スクロールバー
エディットボックスの下端にスクロールバーが出る
右端を越えようとすると勝手にスクロールする
水平オートスクロール
右端を越えようとすると勝手にスクロールするが、スクロールバーは表示されない
垂直スクロールバー
エディットボックスの右端にスクロールバーが出る
下端を越えようとすると勝手にスクロールする
水平オートスクロール
下端を越えようとすると勝手にスクロールするが、スクロールバーは表示されない
パスワード
文字を入力すると*表示になり変換キーが使えなくなる このスタイルだけはウィンドウを作った後に変更できない
常に選択を表示
エディットボックス内で文字を選択している時、フォーカスを失うと通常は選択エリアは表示されなくなるが
これがチェックされていると選択範囲が表示されたままになる
OEM変換
たぶんANSI文字セットで入力された文字がOEM文字セットに変換されてるんだと思う
改行を許可
ENTERによる改行を許可する。
ダイアログボックスにデフォルトのボタンが付いている場合、ENTERを押すとそっちのボタンを押してしまう…らしいが
チェックしてなくとも複数行スタイルがチェックされてればENTERで改行できる。謎。
ABのダイアログボックスは擬似的な物だからだと思う。
本当のダイアログボックスでデフォルトのボタンが付いてた場合、Enterを押すとボタンが押されるはずだ。
それを解除し、Enterで改行を許可するかどうかを決めるプロパティがこれ。
大文字変換/小文字変換
そのまんま
読み取り専用
無効に似ているがフォーカスが当たる。コピーなどの操作が可能
テキストの配置
そのまんま

[edit]
操作サンプル †

以下の例では特に記述が無ければhEditBoxはエディットボックスのハンドルを示す
またSendMessage以外の関数を用いる方法は他のアプリケーションが持つウィンドウに使用することはできない

[edit]
現在の文字数を取得する †

方法1
return = GetWindowTextLength(hEditBox)

方法2
return = SendMessage(hEditBox,WM_GETTEXTLENGTH,0,0)

どちらの方法でもreturnに文字数が入る

[edit]
テキストを設定する †

方法1
SetWindowText(hEditBox,Buffer)

方法2
SendMessage(hEditBox,WM_SETTEXT,0,Buffer)

Bufferはセットしたい文字列の先頭のポインタを示すBytePtr型の変数
もしくはString型変数をStrPtrに渡した戻り値

[edit]
テキストを取得する †

例としてエディットボックスの文字列を全て取得してみる
Dim Buffer As BytePtr
Dim Length As Long

Length = GetWindowTextLength(hEditBox)
Buffer = calloc(Length+1)
GetWindowText(hEditBox,Buffer,Length+1)
MessgaeBox(hEditBox,Buffer,NULL,MB_OK)

free(Buffer)

多少注意が必要な点があります
文字列の長さはLengthの値で合っていますが、GetWindowTextは文字列の終端にNULL文字(&H00)を書き込もうとする為
必要なバッファが1バイト多くなってしまいます
この状態でLengthをそのまま使うと尻が切れてしまうので、Length+1にして修正しています
callocの引数も+1している事にも注意して下さい
それが無いとヒープエラー出ます

またGetWindowTextの所は
SendMessage(hEditBox,WM_GETTEXT,Length+1,Buffer)

で代用可能です

[edit]
元に戻す処理 †
SendMessage(hEditBox,WM_UNDO,0,0)

ただし元に戻せるのは1回だけ

[edit]
切り取り/コピー/貼り付け処理 †

上から順に切り取り、コピー、ペースト処理。それ以外特に書くことは無い。
SendMessage(hEditBox,WM_CUT,0,0)
SendMessage(hEditBox,WM_COPY,0,0)
SendMessage(hEditBox,WM_PASTE,0,0)