〜 オブジェクト 〜
コンボボックスのリストの開閉状態取得と開閉設定

コンボボックスはリストボックスと違って選択アイテム以外は表示しないコントロールです。
通常、右端のドロップダウンボタンを押すことで他のリストアイテムも表示されるようになってますが、
このボタンを押さずともプログラムで自動的に開くやり方と、
リストが現在開かれているか否かの状態を取得するやり方を説明します。

今回紹介する機能も追加や削除・取得等の処理と同様にメッセージ送受信によって実現させます。
HSP3からは標準命令のsendmsg命令が使えるものの、
HSP2は標準オブジェクトではなくobjsend命令が使えないのでAPI関数SendMessageでやり取りします。

API関数SendMessageをHSP用に標準命令で使えるようにしたものがsendmsg命令なので、
sendmsg命令のパラメータ同様に「ハンドル, コード, wparam, lparam」で記述できます。
メッセージコードwparamlparam内容
CB_SHOWDROPDOWN(=0x014F)表示フラグ不使用(=0)コンボボックスの自動開閉
CB_GETDROPPEDSTATE(=0x0157)不使用(=0)不使用(=0)コンボボックスの開閉状態取得
取得も設定も0で閉じた状態、1で開いた状態をとなっています。 尚、利用者にボタン等で操作させる場合、開いていても閉じてしまうし、 現在の開閉状態をダイアログで表示させようとしても閉じてしまうので、 扱いにくい部分があって用途としてはあまりないかもしれません。 下記のサンプルでは、コンボボックスを開いている時にもマウスカーソル位置を取得する必要があり、 オブジェクト操作時に取得できないシステム変数mousexmouseyに代わるginfo命令・関数を使用しています。 コンボボックスの開閉状態取得・設定を行う為だけにはこれらのサイズ取得命令は必要ありません。 枠幅やタイトルバー高さのサイズを取得する命令の詳細についてはコチラの紹介を参照してください。

getwakusize
[パラメータなし]ウィンドウの枠幅を取得するだけの為、パラメータは必要ない。
尚、取得した枠幅はstatに格納される。

getcaptionsize
[パラメータなし]タイトルバーの高さを取得するだけの為、パラメータは必要ない。
尚、取得したサイズはstatに格納される。

combox_open オブジェクトID, 開閉フラグ
オブジェクトIDドロップダウンリストの開閉をするオブジェクトIDを指定する。
開閉フラグ対象のコンボボックスを閉じる(=0)か開く(=1)か指定する。

combox_state オブジェクトID
オブジェクトID状態(0:閉, 1:開)を取得するオブジェクトIDを指定する。

 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
40
41
42
43
44
45
46
47
48
49
#module
#deffunc getwakusize
	mref stt, 64
	ginfo 5
	stt = prmx - winx / 2
	return

#deffunc getcaptionsize
	mref stt, 64
	getwakusize
	stt = prmy - winy - (stat * 2)
	return

#deffunc combox_open int, int
	mref id, 0 : mref flg, 1
	objsend id, 0x014F, flg, nouse
	return

#deffunc combox_state int
	mref id, 0
	objsend id, 0x0157, 0, nouse
	return
#global

	sdim state, 6, 2
	state = "close", "open"
	close =  50, 50, 250, 250
	open  = 300, 50, 500, 250
	objsize 150, 20
	combox index, , "スキー\nスノーボード\nクロスカントリー"
	color 255, 150, 150 : boxf close.0, close.1, close.2, close.3
	color 150, 150, 255 : boxf open.0,  open.1,  open.2,  open.3
	color
	pos close.0 + 10, close.1 + 10 : mes state.0
	pos open.0  + 10, open.1  + 10 : mes state.1
	pos close.0 + 10, close.2 + 10 : mes "上の色付きエリアにマウスを持っていくと…?"
	getwakusize : size.0 = stat
	getcaptionsize : size.1 = stat
	repeat
		wait 1
		combox_state
		title state.stat
		ginfo 0 : mp = prmx, prmy
		ginfo 2 : mp = mp.0 - prmx - size, mp.1 - prmy - size.1 - size
		if mp.1 >= close.1 & (mp.1 <= close.3) {
			if mp.0 >= close.0 & (mp.0 <= close.2) : combox_open 0, 0
			if mp.0 >= open.0  & (mp.0 <= open.2)  : combox_open 0, 1
		}
	loop

枠幅 = getwakusize( )
枠幅取得したウィンドウ枠幅の受取先を指定する。
[パラメータなし]ウィンドウの枠幅を取得するだけの為、パラメータは必要ない。

高さ = getcaptionsize( )
高さ取得したタイトルバー高さの受取先を指定する。
[パラメータなし]タイトルバーの高さを取得するだけの為、パラメータは必要ない。

combox_open オブジェクトID, 開閉フラグ
オブジェクトIDドロップダウンリストの開閉をするオブジェクトIDを指定する。
開閉フラグ対象のコンボボックスを閉じる(=0)か開く(=1)か指定する。

状態 = combox_state(オブジェクトID)
状態取得した状態(0:閉, 1:開)の受取先を指定する。
オブジェクトID状態を取得するオブジェクトIDを指定する。

 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
#define ctype getwakusize ((ginfo(6) - ginfo(4) - ginfo(12)) / 2)
#define ctype getcaptionsize (ginfo(7) - ginfo(5) - ginfo(13) - getwakusize() * 2)

#module
#deffunc combox_open int id, int flg
	sendmsg objinfo(id, 2), 0x014F, flg
	return

#defcfunc combox_state int id
	sendmsg objinfo(id, 2), 0x0157
	return stat
#global

	state = "close", "open"
	close =  50, 50, 250, 250
	open  = 300, 50, 500, 250
	objsize 100, 20
	combox index, , "スキー\nスノーボード\nクロスカントリー"
	color 255, 150, 150 : boxf close.0, close.1, close.2, close.3
	color 150, 150, 255 : boxf open.0,  open.1,  open.2,  open.3
	color
	pos close.0 + 10, close.1 + 10 : mes state.0
	pos open.0  + 10, open.1  + 10 : mes state.1
	pos close.0 + 10, close.2 + 10 : mes "上の色付きエリアにマウスを持っていくと…?"
	repeat
		wait 1
		title state.combox_state(0)
		mp = ginfo_mx - ginfo_wx1 - getwakusize(), ginfo_my - ginfo_wy1 - getcaptionsize() - getwakusize()
		if mp.1 >= close.1 & mp.1 <= close.3 {
			if mp.0 >= close.0 & mp.0 <= close.2 : combox_open 0, 0
			if mp.0 >= open.0  & mp.0 <= open.2  : combox_open 0, 1
		}
	loop