〜 オブジェクト 〜
擬似オブジェクトを配置1 (要USER32.DLL)

HSP2以下ではオブジェクトを1つのウィンドウに最大64個しか配置できません。
厳密には配置はできますが、データ保持数は64個までしか出来ないので、使い物になりません。
HSP3以降だと最大16,384個まで配置できるようになっていますが、
配置できる場合でも多量のオブジェクトを配置してしまうと、
負荷が掛かり過ぎて思うように操作できない等の問題が生じてしまうため、
お世辞にも良いといえるプログラムではなく、再考する必要があると言えます。
尚、HSP3以降で1,025個以上のオブジェクトを配置するにはコチラを参照してください。

さて、多量のオブジェクトを配置するのが問題だとはいえ、
マインスイーパのようなアプリケーションを作成する場合、大量のコントロールが必要になりますね。
このような場合に使えるのが、擬似オブジェクトの配置。
マインスイーパのようなボタンを大量配置するにはAPI関数DrawFrameControlで配置(描画)できます。
下記の表にあるように、チェックボックスやラジオボタン等の擬似オブジェクトは配置できますが、
リストボックスや入力ボックス等はこのAPI関数で配置できませんので、
コチラにあるような形で実現させてください。

API関数DrawFrameControlの引数は
貼付先デバイスコンテキスト、Rect構造体(左・上・右・下端の座標)、オブジェクトタイプ、スタイルで、
第3引数のタイプ(uType)と第4引数のスタイル(uStyle)は次のいずれかを指定します。
タイプスタイル効果
DFC_CAPTION0x0001DFCS_CAPTIONCLOSE0x0000「閉じる」ボタン
DFCS_CAPTIONMIN0x0001「最小化」ボタン
DFCS_CAPTIONMAX0x0002「最大化」ボタン
DFCS_CAPTIONRESTORE0x0003元のサイズに戻す」ボタン
DFCS_CAPTIONHELP0x0004「ヘルプ」ボタン
DFC_MENU0x0002DFCS_MENUARROW0x0000サブメニューを示す右矢印
DFCS_MENUCHECK0x0001チェックマーク
DFCS_MENUBULLET0x0002黒丸
DFCS_MENUARROWRIGHT0x0004サブメニューを示す左矢印(アラビア用)
DFC_SCROLL0x0003DFCS_SCROLLUP0x0000上向き矢印
DFCS_SCROLLDOWN0x0001下向き矢印
DFCS_SCROLLLEFT0x0002左向き矢印
DFCS_SCROLLRIGHT0x0003右向き矢印
DFCS_SCROLLCOMBOBOX0x0005スクロールバー(コンボボックス)
DFCS_SCROLLSIZEGRIP0x0008サイズグリップ(主にステータスバー右端にある三角形)
DFCS_SCROLLSIZEGRIPRIGHT0x0010サイズグリップ(アラビア用)
DFC_BUTTON0x0004DFCS_BUTTONCHECK0x0000チェックボックス
DFCS_BUTTONRADIOIMAGE0x0001ラジオボタンのイメージ
DFCS_BUTTONRADIOMASK0x0002ラジオボタンのマスク
DFCS_BUTTONRADIO0x0004ラジオボタン
DFCS_BUTTON3STATE0x00083ステートチェックボックス
DFCS_BUTTONPUSH0x0010通常のボタン
共通(主にボタンで使用できる)スタイルとして、下記の分を加算(複数選択)することも出来ます。
スタイル効果
DFCS_INACTIVE+0x0100無効状態(淡色表示)
DFCS_PUSHED+0x0200押下状態
DFCS_CHECKED+0x0400チェック状態
DFCS_TRANSPARENT+0x0800背景透過
DFCS_HOT+0x1000マウスやキーボードに反応するホットトラッキング表示
DFCS_ADJUSTRECT+0x2000境界を調節してボタン周囲の辺を除外
DFCS_FLAT+0x4000凹凸のない平らなボタン
DFCS_MONO+0x8000モノクローム境界を持つボタン
尚、API関数DrawFrameControlでは、クラシックスタイルでの擬似オブジェクトになります。 もし、ビジュアル(WindowsXP)スタイルでの擬似オブジェクトを配置する場合、 未確認ですが、uxtheme.DLLのAPI関数DrawTheme***系を併用するようです。

drawbutton "name", オプション
"name"擬似ボタンのキャプションテキストを指定する。
オプションオプション(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
	ll_libload user, "user32.dll"
	ll_getproc DrawFrameControl, "DrawFrameControl", user

#module
#deffunc drawbutton str, int
	mref caption, 32 : mref option, 1
	mref bmscr, 67
	rect = csrx, csry, csrx + bmscr.29, csry + bmscr.30
	prm = bmscr.4, 0, 0x0004, (option = 1 * 0x0200) + (option = 2 * 0x4000) + 0x0010
	ll_getptr rect : ll_ret prm.1
	ll_callfunc prm, 4, DrawFrameControl@
	i = bmscr.40 & 0xFF, bmscr.40 >> 8 & 0xFF, bmscr.40 >> 16 & 0xFF
	color
	pos winx : mes caption
	ginfo 7
	pos (bmscr.29 - prmx) / 2 + rect.0, (bmscr.30 - prmy) / 2 + rect.1 : mes caption
	color i.0, i.1, i.2
	redraw
	return
#global

	font msmincho, 12 : objmode 2
	objsize 100, 25
	pos 10,  10 : drawbutton "通常のボタン", 0
	pos 10,  40 : drawbutton "押下済ボタン", 1
	pos 10,  70 : drawbutton "平らなボタン", 2
	pos 10, 100 : button "本物のボタン", *exit
	stop

*exit

drawbutton "name", オプション
"name"擬似ボタンのキャプションテキストを指定する。
オプションオプション(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
#uselib "user32.dll"
#func global DrawFrameControl "DrawFrameControl" int, var, int, int

#module
#deffunc drawbutton str caption, int option, local rect, local i
	mref bmscr, 67
	rect = ginfo_cx, ginfo_cy, ginfo_cx + bmscr.29, ginfo_cy + bmscr.30
	DrawFrameControl hdc, rect, 0x0004, (option = 1) * 0x0200 + (option = 2) * 0x4000 + 0x0010
	i = ginfo_r, ginfo_g, ginfo_b
	color
	pos ginfo_winx : mes caption
	pos (bmscr.29 - ginfo_mesx) / 2 + rect.0, (bmscr.30 - ginfo_mesy) / 2 + rect.1 : mes caption
	color i.0, i.1, i.2
	redraw
	return
#global

	font msmincho, 12 : objmode 2
	objsize 100, 25
	pos 10,  10 : drawbutton "通常のボタン", 0
	pos 10,  40 : drawbutton "押下済ボタン", 1
	pos 10,  70 : drawbutton "平らなボタン", 2
	pos 10, 100 : button "本物のボタン", *exit
	stop

*exit
	end