Last Update : 2008/06/xx
ウィンドウ関連 || オブジェクト関連1 || オブジェクト関連2
sendmsg命令の第1パラメータに指定するオブジェクトのウィンドウハンドル値は、objinfo関数を利用して取得します。
□ オブジェクトの表示文字列取得
WM_GETTEXTメッセージを使って、ボタン(button命令)やチェックボックス(chkbox命令)上の文字列取得と、コンボボックス(combox命令)の選択項目文字列取得ができます。メッセージボックス(mesbox命令)、入力ボックス(input命令)でも一応取得が可能です。リストボックス(listbox命令)は利用できません。
; あらかじめ文字列型変数用の領域確保 sdim buf button "ぼたーん", *a sendmsg objinfo(stat, 2), $D, 64, varptr(buf) mes "文字列: "+buf+" ["+stat+"byte] ; コンボボックスは選択されている項目の文字列 b = 1 combox b, , "HSPの\nコンボ\nボックス\nでーす" sendmsg objinfo(stat, 2), $D, 64, varptr(buf) mes "文字列: "+buf+" ["+stat+"byte] *a
□ オブジェクトの表示フォントの再設定
下はフォントサイズの例。font命令でフォントを指定した後、HSPのBMSCR構造体からこのフォントのハンドル値を取得し、WM_SETFONTメッセージを送信してオブジェクトに反映させてます。注意点として、この手法の場合、これ以降font命令を呼ぶとオブジェクト上のフォントはリセットされてしまいます。(→ 参照、ちょくとさんページ)
objsize 300, 200 button "ボタン", *change hButton = objinfo(stat, 2) ; フォントサイズ a = 20 input a, 50, 20 stop *change ; 新たなフォントを指定 font "", a ; BMSDR構造体(フォントハンドルがBMSCR.38に返る) mref BMSCR, 67 ; WM_SETFONTメッセージ sendmsg hButton, $30, BMSCR.38, 1
見た目がぜんぜん違いますが、ボタンのウィンドウスタイルを変更して外観を変えたのがチェックボックスです。どちらもボタンコントロールに分類されます。
ウィンドウメッセージは「BM_〜」という名前で始まり、10個ほどの数です。Windows XP/Windwos Vistaでは「BCM_〜」ではじまるメッセージが新たに10個ほど追加されてます。一覧が掲載されたMSDNのページ(英語)を確認してください。
□ 太枠ボタン
button "枠が太いね", *a sendmsg objinfo(stat, 2), $F4 , $1 *a
□ ボタンクリックのシミュレート
; スクリプトから擬似的にボタンクリック button gosub "!", *push hButton = objinfo(stat, 2) repeat ; 5秒ごとに await 5000 ; BM_CLICKメッセージ sendmsg hButton, $F5 loop *push ; ボタンが押されて、通常の状態に戻る状態の描画は行われない mes "押したー" return
; スクリプトから描画上のボタンクリック onclick gosub *jump button gosub "!", *push hButton = objinfo(stat, 2) stop *push ; あくまでボタンを押された状態を描画させるだけなので、 ; 直接ボタン押したりしない限り、このラベルへのジャンプなし。 mes "押したー" return *jump ; BM_SETSTATE ; wparam値に1指定で押された状態を描画、0で通常の状態 sendmsg hButton, $F3, 1 wait 10 sendmsg hButton, $F3 return
□ ボタンやチェックボックスの状態取得
; ボタンコントロールの状態取得 (by Kpan) #define BST_UNCHECKED 0x0000 ; チェックなし #define BST_CHECKED 0x0001 ; チェックあり #define BST_INDETRMINATE 0x0002 ; 灰色チェックあり (3ステートチェックボックス) #define BST_PUSHED 0x0004 ; マウスの左ボタンが押し下げられている状態 #define BST_FOCUS 0x0008 ; フォーカス矩形あり a = 1 chkbox "状態", a hChkbox = objinfo(stat, 2) button "確認", *check stop *check ; BM_GETSTATE ; システム変数statに上の数値の組み合わせが返る sendmsg hChkbox, $F2 mes stat
□ ラジオボタンの作成
複数項目の中から1項目のみ選択させる、丸い形状のチェック項目が付いたオブジェクト「ラジオボタン」。チェックボックスに若干似ているものですが、HSPの標準命令では用意されていません。
□ チェックボックスの表示文字列変更
チェックボックス(chkbox命令)に対してobjprm命令を利用すると、HSP2では表示文字列の変更もできましたが、HSP 3.0/3.1では状態の変更(チェックマークのON/OFF)でしか機能しません。ただ、HSP 3.2以降はobjprm命令でチェックボックスの文字列を変更できるようになります。(→ HSP3 オブジェクト)
というわけで、WM_SETTEXTメッセージを送って、表示文字列を変更するソーススクリプトです。ちなみに、このメッセージはチェックボックスに限らず、メッセージボックスやボタンなどでも利用できます。ウィンドウが複数あってフォーカスを移さずに裏側で内容を変更したい場合とか。
; HSP 3.0/3.1用 chkbox "ちぇっく", a hChkbox = objinfo(stat, 2) button "変更", *change stop *change ; 第4パラのlparam値に変更する文字列 sendmsg hChkbox, $C, , "へんこ〜。"