Last Update : 2008/03/xx
ウィンドウ 関連 | ボタン・チェックボックス | 入力ボックス・メッセージボックス | リストボックス・コンボボックス
Win32プログラミングではエディトコントロールといいます。HSPでは1行表示をinput命令、複数行表示をmesbox命令として利用できるようにしてます。エディトコントロール向けのウィンドウメッセージは、「EM_〜」という頭文字で始まり、数は40種ほどです。MSDNのページ(英語)で一覧を確認できます。
sendmsg命令の第1パラメータに指定するのは、オブジェクトのウィンドウハンドル値です。HSPのobjinfo関数を利用して取得します。
※ Windows XP以降で、エディトコントロール内の文字数のカウントがバイト単位から文字単位に切り替わってます。選択範囲を取得したりする場合にいろいろと不都合がでてくる可能性があります。
□ 入力ボックスの編集無効化
入力ボックスやメッセージボックス内を編集できないよう灰色表示(使用不可状態・グレー表示)に切り替えます。ユーザーによる文字入力を受け付けなくなり、表示専用ボックスになります。mesbox命令はパラメータ指定で用意できますが、設置した後の解除が可能です。obj.asモジュールによるobjgray命令やHSP 3.2以降の標準命令であるobjenable命令でも実現できます。
→ HSP3 オブジェクト編 2 (入力ボックス・編集無効)
□ 入力ボックスのパスワードボックス化
入力した文字列を「*」(アスタリスク)で置き換える入力ボックス(input命令)の設置です。
→ HSP命令解説講座 (input命令・パスワードボックス)
□ メッセージボックス 雑多スクリプト
// エディトコントロール雑多スクリ1 (by Kpan) #include "user32.as" ; check4ラベルでのみ必要 notesel buf noteload "readme.txt" mesbox buf, 600, 100 hMesbox = objinfo(stat, 2) button "1行取得", *check1 button "行数取得", *check2 button "スクロール", *check3 button "マージン", *check4 stop *check1 ; 現在のカーソル行を取得 (EM_LINEFROMCHAR) sendmsg hMesbox, $C9, -1 linev = stat ; 文字列が返る変数領域を確保 sdim data, 512 ; 変数領域の最初のバイト位置に確保したサイズを指定しておく wpoke data, , 512 ; 行文字取得 (EM_GETLINE) sendmsg hMesbox, $C4, linev, varptr(data) mes data stop *check2 ; 全体の行数取得 (EM_GETLINECOUNT) sendmsg hMesbox, $BA mes stat stop *check3 #define SB_LINEUP 0 ; 1行上に #define SB_LINEDOWN 1 ; 1行下に #define SB_PAGEUP 2 ; 1ページ上に #define SB_PAGEDOWN 3 ; 1ページ下に ; 縦スクロール移動 (EM_SCROLL) sendmsg hMesbox, $B5, SB_PAGEDOWN stop *check4 #define EC_LEFTMARGIN 1 ; 左側 #define EC_RIGHTMARGIN 2 ; 右側 #define ctype MAKELONG(%1,%2) (%1 & $FFFF | %2 << 16) ; 左右マージン指定 (EM_SETMARGINS) ; wparam値: 左 or 右 or 両方組み合わせ ; lparam値: 上位ビット左側px、下位ビットに右側px PostMessage hMesbox, $D3, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(10, 50) stop
ここではmesbox命令を使ったサンプルですが、input命令に対しても利用できます。
// エディトコントロール雑多スクリ2 (by Kpan) #define EM_SETSEL $B1 #define EM_REPLACESEL $C2 #define WM_CUT $300 #define WM_COPY $301 #define WM_PASTE $302 #define WM_CLEAR $303 #define WM_UNDO notesel buf noteload "readme.txt" mesbox buf, 600, 200 hMesbox = objinfo(stat, 2) objsize 100 button "EM_SETSEL", *setsel button "EM_REPLACESEL", *replace button "WM_CUT", *cut button "WM_COPY", *copy button "WM_PASTE", *paste button "WM_CLEAR", *clear stop *setsel ; 全文字列選択 (※反転表示として表現されないので注意) sendmsg hMesbox, EM_SETSEL, 0, -1 stop *replace ; 選択文字列を指定した文字列に置き換え sendmsg hMesbox, EM_REPLACESEL, , "へんこー" stop *cut ; 選択文字列を切り取り sendmsg hMesbox, WM_CUT stop *copy ; 選択文字をクリップボードにコピー sendmsg hMesbox, WM_COPY stop *paste ; 指定位置にクリップボードの文字列を貼り付け sendmsg hMesbox, WM_PASTE stop *clear ; 選択文字列を削除 sendmsg hMesbox, WM_CLEAR stop
□ クリップボードに文字列コピー
Windowsのクリップボードに指定文字列をコピー転送する裏技的な方法です。普通なら、拡張プラグイン「hspext.dll」のclipset命令か、Win32
API関数を呼ぶことになりますが、隠しのinput命令やmesbox命令を設置しておいて、そこにobjprm命令で文字列を表示、sendmsg命令で「EM_SETSEL」(全選択)と「WM_COPY」(転送)を送信してやります。
// クリップボード文字列転送 #define moji "HSPクリップボード♪" sdim buf, 128 pos 100, 100 input buf, 0, 0 ; 表示サイズ0で見えません hInput = objinfo(stat, 2) button "コピー", *copy stop *copy objprm 0, moji ; EM_SETSEL (文字列の全選択) sendmsg hInput, $B1, , -1 ; WM_COPY (クリップボードに転送) sendmsg hInput, $0301