Last Update : 2008/06/xx
ウィンドウ 関連 | ボタン・チェックボックス | 入力ボックス・メッセージボックス | リストボックス・コンボボックス
sendmsg命令の第1パラメータに指定するGUIオブジェクトのウィンドウハンドル値は、HSPの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
見た目がぜんぜん違いますが、ボタンのウィンドウスタイルを変更して見た目を変えたのがチェックボックスです。どちらもWin32プログラミング上ではボタンコントロールに分類されてます。
ボタンコントロールのウィンドウメッセージは「BM_〜」という頭文字で始まり、数は10個ほどです。Windows XP以降では「BCM_〜」の頭文字で始まるメッセージが新たに10個ほど追加されてます。MSDNのページ(英語)に一覧が掲載されてます。
□ 太枠ボタン
button "枠が太いね", *jump sendmsg objinfo(stat, 2), $F4 , $1 stop *jump
□ ボタンクリックのシミュレート
// スクリプトから擬似的にクリックシミュレート button gosub "!", *push hButton = objinfo(stat, 2) repeat wait 100 ; 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指定で押された状態の描画 sendmsg hButton, $F3, 1 wait 10 ; 0指定(省略)で通常の状態の描画 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 ; フォーカスあり onclick gosub *check value = 1 chkbox "状態", value hChkbox = objinfo(stat, 2) stop *check ; BM_GETSTATE ; システム変数statに上の数値の組み合わせで返る sendmsg hChkbox, $F2 mes stat return
□ ラジオボタンの作成
複数項目の中から1項目のみ選択させる、丸い形状のチェック項目が付いたオブジェクト「ラジオボタン」。チェックボックスに若干似ているものですが、HSPの標準命令では用意されていません。chkbox命令とsendmsg命令のうまく組み合わせて実現します。
□ チェックボックスの表示文字列変更
チェックボックス(chkbox命令)に対してobjprm命令を利用すると、HSP2では表示文字列の変更ができましたが、HSP 3.0/3.1では状態の変更(チェックマークのON/OFF)でしか機能しません。(HSP 3.2以降はobjprm命令で変更できるように改善されてます。)
というわけで、WM_SETTEXTメッセージを送って、表示文字列を変更するサンプルソースです。ちなみに、このメッセージはチェックボックスに限らず、ボタン、入力ボックス、メッセージボックスに対しても利用できます。
ウィンドウが複数あって、gsel命令を使わずフォーカスも移さずに内容を変更したい場合に有用です。
// チェックボックスの文字列変更 (HSP 3.0/3.1用) chkbox "ちぇっく", value hChkbox = objinfo(stat, 2) button "変更", *change stop *change ; 第4パラのlparam値に変更する文字列を指定 sendmsg hChkbox, $C, , "へんこ〜。"