〜 オブジェクト 〜
3ステートチェックボックスを配置

「はい」「いいえ」等の2択を選択させる時、チェックボックスを利用できますが、
「はい」「いいえ」「どちらでもない・そのどちらも当てはまる」こんな3パターンである場合、
2パターンしかないチェックボックスは使用できず、コンボボックスやリストボックスを使うのが普通です。
3パターンでもチェックボックスで実現したい場合は3ステートチェックボックスを使いましょう。
3ステートチェックボックスは、ファイルやフォルダの属性プロパティに使われているもので、
複数選択ファイルのうち、1つだけ読取専用や隠し属性を付けるとチェック状態が変わります。
ココで説明しているのはこう言う時にも使えるヤツですが、
標準命令で配置できるオブジェクトには、この3ステートチェックボックスが用意されていません。
かといって、DLLを使用するのではなく、標準命令を組み合わせることで実現させましょう。
HSPには標準でオブジェクトにメッセージを送る命令が用意されていて、
HSP2だとobjsend命令、HSP3だとsendmsg命令でスタイル変更「BM_SETSTYLE(=0x00F4)」、
変更スタイルに「BS_AUTO3STATE(=0x0006)」を次のように指定しましょう。

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

チェックボックスのスタイルを元に変更する場合は、指定した状態保持用変数に、 非チェック(=0)、チェック済(=1)、3番目の状態(=2)のいずれかがセットされます。 もし、ボタンを元に作成した場合は、チェック状態を変数で別途管理するか、 「BM_GETSTATE(=0x00F2)」メッセージを送信してチェックの有無を取得してください。

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

結果はstatに入りますが、「BM_GETSTATE(=0x00F2)」はチェック状態だけを取得するものではなく、 フォーカスや強調表示状態も取得されるもので、statにはチェック状態以外も同時にセットされるため、 チェック状態の取得は「stat & 0x03」でビットマスクして0なのか1なのか2なのかを確認してください。 尚、スタイル「BS_AUTO3STATE(=0x0006)」以外も「BS_3STATE(=0x0005)」があり、 名前からわかる通り、コチラは自動チェックではなく、手動チェックとなります。 手動チェックボックスは、通常のチェックボックスと異なって押されたりobjprmでも変更できず、 チェック状態変更イベントの時に「BM_SETCHECK(=0x00F1)」メッセージ送信で行いますが、 ボタンから作成しない場合は、チェック切り替えによるイベントをループ監視で検出せねばならず、 面倒かもしれません。ココではあまりメリットがありませんので説明だけにしておきます。

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

下記サンプルは通常チェックボックスを元に自動3ステートチェックボックスのモジュール命令です。

chkbox3 キャプション, 保持変数
キャプションボックス横に表示するテキストを指定する。
保持変数チェック状態を保持する変数を指定する。

getchkbox3 ID, 格納変数
ID取得する3ステートチェックボックスのオブジェクトIDを指定する。
格納変数取得したチェック状態(0:非チェック 1:チェック済 2:灰色)を格納する変数を指定する。

setchkbox3 ID, 状態
ID設定する3ステートチェックボックスのオブジェクトIDを指定する。
状態チェック状態(0:非チェック 1:チェック済 2:灰色)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#module
#deffunc chkbox3 str, val
	mref caption, 32 : mref state, 17
	chkbox caption, state
	objsend stat, 0x00F4, 0x06, nonuse, 0 // 3ステートチェックボックス
	return

#deffunc getchkbox3 int, val
	mref id, 0 : mref state, 17
	objsend id, 0x00F2, 0x00, nonuse, 0   // 状態取得
	state = stat & 0x03
	return

#deffunc setchkbox3 int, int
	mref id, 0 : mref value, 1
	objsend id, 0x00F1, value, nonuse, 0  // 状態変更
	return
#global

	objsize 150, 25
	pos 10,  10 : mes "野菜が好きならチェックしよう!"
	pos 10,  40 : chkbox3 "私は野菜好き", chk // 3ステートチェックボックスを配置する
	pos 10,  70 : button "確認する", *push
	pos 10, 150 : combox chg, 100, "嫌いに変える\n好きに変える\nどっちだろう?"
	pos 10, 180 : button "変更する", *change
	stop

*push
	switch chk
		case 0: dialog "嫌いでも食べましょう", 1 : swbreak
		case 1: dialog "好きなのはイイことです", 0 : swbreak
		case 2: dialog "ハッキリしましょう", 1 : swbreak
	swend
	stop

*change
	setchkbox3 0, chg // 状態を変更する
	getchkbox3 0, chk // 管理変数を更新する
	stop

chkbox3 キャプション, 保持変数
キャプションボックス横に表示するテキストを指定する。
保持変数チェック状態を保持する変数を指定する。

getchkbox3 ID, 格納変数
ID取得する3ステートチェックボックスのオブジェクトIDを指定する。
格納変数取得したチェック状態(0:非チェック 1:チェック済 2:灰色)を格納する変数を指定する。

setchkbox3 ID, 状態
ID設定する3ステートチェックボックスのオブジェクトIDを指定する。
状態チェック状態(0:非チェック 1:チェック済 2:灰色)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#module
#deffunc chkbox3 str caption, var state
	chkbox caption, state
	sendmsg objinfo(stat, 2), 0x00F4, 0x06, 0 // 3ステートチェックボックス
	return

#deffunc getchkbox3 int id, var state
	sendmsg objinfo(id, 2), 0x00F2, 0x00, 0   // 状態取得
	state = stat & 0x03
	return

#deffunc setchkbox3 int id, int value
	sendmsg objinfo(id, 2), 0x00F1, value, 0  // 状態変更
	return
#global

	objsize 100, 25
	pos 10,  10 : mes "野菜が好きならチェックしよう!"
	pos 10,  40 : chkbox3 "私は野菜好き", chk // 3ステートチェックボックスを配置する
	pos 10,  70 : button gosub "確認する", *push
	pos 10, 150 : combox chg, 100, "嫌いに変える\n好きに変える\nどっちだろう?"
	pos 10, 180 : button gosub "変更する", *change
	stop

*push
	switch chk
		case 0: dialog "嫌いでも食べましょう", 1 : swbreak
		case 1: dialog "好きなのはイイことです", 0 : swbreak
		case 2: dialog "ハッキリしましょう", 1 : swbreak
	swend
	return

*change
	setchkbox3 0, chg // 状態を変更する
	getchkbox3 0, chk // 管理変数を更新する
	return