Last Update : 2007/06/xx
ウィンドウ関連 || オブジェクト関連1 || オブジェクト関連2
内部的にはエディトコントロールというオブジェクトです。要は1行ボックスか複数行ボックスかの違いで、HSPではinput命令とmesbox命令の2命令で用意されてます。エディトコントロール向けのウィンドウメッセージは「EM_〜」という名前ではじまり、40個ほどあります。MSDNのページ(英語)で一覧を確認できます。
sendmsg命令の第1パラメータで指定するオブジェクトのウィンドウハンドル値は、objinfo関数を利用して取得します。
□ 入力ボックスの編集無効化
入力ボックスやメッセージボックス内を編集できないよう灰色表示(使用不可状態)に切り替えます。
→ HSP3 オブジェクト編 2 (入力ボックス・編集無効)
□ 入力ボックスのパスワードボックス化
入力した文字列を「*」(アスタリスク)で置き換えて表示する入力ボックス(input命令)の表示です。
→ HSP命令解説講座 (input命令・パスワードボックス)
□ メッセージボックス 雑多スクリプト
; エディトコントロール雑多スクリ (by Kpan) #uselib "user32" #func PostMessage "PostMessageA" int, int, int, int notesel a noteload "readme.txt" mesbox a, 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 buf, 512 ; 変数領域の最初のバイト位置に確保したサイズを指定しておく wpoke buf, , 512 ; 行文字取得 (EM_GETLINE) sendmsg hMesbox, $C4, linev, varptr(buf) mes buf 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_RIGHTMARGIN, MAKELONG(10, 50) stop
リストボックスのウィンドウメッセージは「LB_〜」ではじまります。MSDNのページ(英語)を確認してください。一方、コンボボックスのウィンドウメッセージは「CB_〜」ではじまります。MSDNのページ(英語)を確認してください。それぞれ40個ほどの数です。
□ リストボックスの項目追加/挿入/削除
リストボックス内の文字列を一気に書き換えることができるHSP標準のobjpm命令を利用しない手法です。
→ HSP3 オブジェクト編 4 (リストボックス・項目文字列の追加や削除)
□ リストボックスの文字列検索
a = -1 listbox a, 100, "HSP1\nHSP2\nHSP3\nHSP4\nHSP5" hListbox = objinfo(stat, 2) objsize 150 sdim keyword input keyword ; 3系統あり button "LB_SELECTSTRING", *search1 button "LB_FINDSTRING", *search2 button "LB_FINDSTRINGEXACT", *search3 stop ; sendmsg命令の共通部分 ; 第3パラ(wparam値)に検索を開始する項目インデックス(0〜) [-1の場合は最初から] ; 第4パラ(lparam値)に検索する文字列 [英文字の大文字小文字区別なし] ; システム変数statに一致した項目インデックス(0〜)が返る [-1の場合はヒットなし] *search1 ; 前方一致検索+項目選択 (LB_SELECTSTRING) sendmsg hListbox, $18C, -1, keyword mes stat stop *search2 ; 前方一致検索 (LB_FINDSTRING) sendmsg hListbox, $18F, -1, keyword mes stat stop *search3 ; 全文一致検索 (LB_FINDSTRINGEXACT) sendmsg hListbox, $1A2, -1, keyword mes stat stop
□ リストボックスの項目の高さ変更
HSPのlistbox命令の場合、このウィンドウメッセージはsendmsg命令(SendMessage関数)で機能しないので、PostMessage関数を利用します。
; 項目の文字自体は、縦方向の中央位置に置かれず。 #uselib "user32" #func PostMessage "PostMessageA" int, int, int, int listbox a, 100, "HSP\nスクリプト\nコード\nリストボックス" hListbox = objinfo(stat, 2) ; LB_SETITEMHEIGHT ; 第4パラのlparam値に高さ (ピクセル単位) PostMessage hListbox, $1A0, , 20
□ リストボックスの特定項目文字列取得
note〜系命令を使わず、指定した項目インデックスに表示されている文字列をsendmsg命令で取得します。
→ HSP3 オブジェクト編 4 (リストボックス・特定項目の文字取得)
□ リストボックスの項目数取得
リストボックスの項目数をsendmsg命令で取得します。
→ HSP3 オブジェクト編 4 (リストボックス・項目数取得)
□ コンボボックスの項目追加/削除
コンボボックス内の文字列を一気に書き換えることができるHSP標準のobjpm命令を利用しない手法です。
→ HSP3 オブジェクト編 5 (コンボボックス・項目文字列の追加や削除)
□ コンボボックスの項目数取得
combox a, 100, "HSP\n講座\nコンボボックス\n項目数" hCombox = objinfo(stat, 2) ; CB_GETCOUNT sendmsg hCombox, $146 mes stat
□ コンボボックスの項目の高さ変更
; 項目の文字自体は、縦方向の中央位置に置かれず。 #uselib "user32" #func PostMessage "PostMessageA" int, int, int, int combox a, 100, "HSP\nスクリプト\nサンプル\nコンボボックス" hCombox = objinfo(stat, 2) ; CB_SETITEMHEIGHT ; 第4パラのlparam値に高さ (ピクセル単位) PostMessage hCombox, $153, , 20
□ コンボボックスの特定項目文字取得
note〜系命令を使わず、指定した項目インデックスに表示されている文字列をsendmsg命令で取得します。
→ HSP3
オブジェクト編 5 (コンボボックス・特定項目の文字取得)
→ sendmsg命令 Tips集
(オブジェクトの表示文字列取得)
□ コンボボックスのドロップダウンリスト開閉
combox a, 100, "HSP\n講座\nsendmsg\nコンボボックス" hCombox = objinfo(stat, 2) button "にょきっ", *open stop *open ; スクリプトからリストを開く (CB_SHOWDROPDOWN) sendmsg hCombox, $14F, 1 wait 100 ; 逆の閉じる sendmsg hCombox, $14F