〜 オブジェクト 〜
監視せずチェックボックスの変更時に処理

「はい」「いいえ」等の2択を選択させる時、チェックボックスを利用すると便利です。
選択切り替えと、選択した結果による処理制御は別プロセスとなりますが、
例えば「現在選択しているチェック状態をリアルタイムで表示する」場合には、
現在のチェック状態をいつでもわかっている必要があります。
チェック状態の監視はコチラのようにループ処理で前回監視時の状態とを比較することでも行えますが、
監視ロジックを組み込まなくても、チェック状態を切り替える瞬間の「切り替えイベント」を検出できます。
配置できるHSP標準オブジェクトは大きく3パターンに分けることができ、
オブジェクト形状は単にパラメータで分けているに過ぎず、チェックボックスはボタンと同じ分類になります。
切り替えイベントをどのように検出するかと言うことですが、
ボタンは押された時に指定ラベルに移動させるものになるので、ボタンの形状をチェックボックスに変えれば、
押された(=チェック状態が変更された)イベントを容易に検出できますよ。
で、ボタンの形を変える方法は、HSP2だとobjsend命令、HSP3だとsendmsg命令で用意されてます。
スタイル変更はオブジェクトに「BM_SETSTYLE(=0x00F4)」、
形状を変えるスタイルパラメータに「BS_AUTOCHECKBOX(=0x0003)」をメッセージを送ります。

HSP2「objsend オブジェクトID, 0x00F4, 0x03, 再描画フラグ, 1」 HSP3「sendmsg オブジェクトハンドル, 0x00F4, 0x03, 再描画フラグ」です。

ボタンで作ったチェックボックスは現在のチェック状態を保持する変数を用意してませんから、 別途、チェック状態を管理しなければなりません。 ジャンプ先ラベルで変数に0・1を交互に送るか、もしくはobjsend命令、sendmsg命令で知りましょう。 命令で状態を知るには状態を取得する「BM_GETSTATE(=0x00F2)」メッセージを次のように送ります。

HSP2「objsend オブジェクトID, 0x00F2, 0x00, 不使用変数(=0), 1」 HSP3「sendmsg オブジェクトハンドル, 0x00F2, 0x00, 不使用(=0)

結果は stat に入りますが、「BM_GETSTATE(=0x00F2)」はチェック状態だけを取得するものではなく、 フォーカスや強調表示状態も取得されるもので、 stat にはチェック状態以外も同時にセットされるため、 チェック状態だけの取得は「 stat & 0x03」でビットマスクしてONなのかOFFなのか確認してください。 尚、スタイル「BS_AUTOCHECKBOX(=0x0003)」以外も「BS_CHECKBOX(=0x0002)」があり、 名前からわかる通り、コチラは自動チェックではなく、手動チェックとなります。 手動チェックボックスは、通常のチェックボックスと異なって押されたりobjprmでも変更できず、 チェック状態変更イベントの時に「BM_SETCHECK(=0x00F1)」メッセージ送信で行います。

HSP2「objsend オブジェクトID, 0x00F1, OFF(=0) or ON(=1), 不使用変数(=0), 1」 HSP3「sendmsg オブジェクトハンドル, 0x00F1, OFF(=0) or ON(=1), 不使用(=0)

取得は「BM_GETSTATE(=0x00F2)」なのに、設定はBM_SETSTATE(=0x00F3)ではできないんですね…。 下記のスクリプトは上記説明の通り、ボタンの形状を変えてみたサンプルになります。 HSP2は「自動チェック、チェック状態もobjsend命令で取得」、 HSP3は「手動チェック、チェック状態は変数切り替えのみ」です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	objsize 100, 25
	pos 10, 10 : button "実はボタンです", *push
	objsend 0, 0x00F4, 0x03, flg, 1 // 自動チェックボックスに変える
	stop

*push
	objsend 0, 0x00F2, 0x00, nonuse, 1 // 状態を取得する
	if stat & 0x03 {
		mes "チェック状態 = ON"
	} else {
		mes "チェック状態 = OFF"
	}
	stop
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	objsize 100, 25
	pos 10, 10 : button "実はボタンです", *push
	sendmsg objinfo(0, 2), 0x00F4, 0x02, 0 // 手動チェックボックスに変える
	stop

*push
	chk = 1 - chk
	sendmsg objinfo(0, 2), 0x00F1, chk, 0 // チェックを反転する
	if chk {
		mes "チェック状態 = ON"
	} else {
		mes "チェック状態 = OFF"
	}