便利なオブジェクト1
ウィンドウ上に画像を貼り付けることができるようになり、
画像はあくまで画像であり、表示に関しては問題ありませんが、
現状では、利用者が行える操作は「終了する(閉じる)」というイベントしかありません。
パソコン(OS)はいろいろなコントロールを用意してくれており、
開発者(提供者)が毎度毎度、複雑なプログラムを組まなくても、
このコントロールを使うことで利用者に簡単に操作してもらうことが出来ます。
提供側の開発が楽になる(開発のコストダウンする)だけでなく、
利用側もある程度決められたコントロールである為に使いやすいと言うメリットがあります。

HSPでも、このOSの提供しているコントロール(HSPでは「オブジェクト」と呼ぶ)を
呼び出して使用することができます。
命令1つで呼び出せるオブジェクトは下記の通りとなっています。
分類 通称 イメージ 概要
スイッチ系 ボタン 押すと予め指定したラベル位置にプログラム処理を移す。
チェックボックス サンプル ON/OFFを選択させる。
リスト系 リストボックス 一覧の中から任意の行を選択させる(予め複数のアイテムが見えている)
コンボボックス 一覧の中から任意の行を選択させる(選択アイテムのみが見える)
エディット系 インプットボックス 任意のテキストを入力してもらう。(1行のみで改行は入れられない)
テキストエリア 任意のテキストを入力してもらう。(複数行に対応)
次章にリスト系を、次々章にエディット系オブジェクトを紹介するとして、 この章ではボタン系を配置する命令を中心に説明していきましょう。
button goto/gosub ボタン上の表記, ラベル
goto/gosubジャンプの方法。ジャンプ後にreturnで戻るか戻らないかの設定。
ボタン上の表記ボタンのキャプション内容。
ラベルジャンプ先のラベル(アスタリスクから書くこと!)。
ボタン処理は、どの処理を実行していようとも、現在の処理に関係なく指定先ラベルにジャンプします。 厳密には、Windowsにタスクが回っていれば(つまりwaitが入っている所)、ですが。 HSP2以前では、ボタンのジャンプはgoto処理限定である為、 フラグで分岐可能ですが、ジャンプ後は同じ処理になって、機能毎のブロック化の妨げになりがちでした。 HSP3からはgosub処理も行えるようになったので、 ボタン押下処理の後に元の処理に簡単に戻せるようになりました。 尚、指定しない(省略する)場合、HSP2以前同様にgoto処理となります。 さて、ボタン上の表記パラメータとはボタン内に表示させるテキストのことです。 テキストの長さに関係なく、中央に表示されますので、 ボタンをはみ出す長さになると、先端と終端の文字が同時に欠けてしまいます。 また、改行文字・文字位置揃え用のタブは使えません改行テキストの左・右揃えにする方法については特殊な準備が必要なのでココでは説明しません。 ラベルパラメータとは、ジャンプ先のラベルのことです。 HSP2以前ではラベル名だけの記述でも問題ありませんでしたがHSP3からはラベル型が導入されたので、 ラベル名そのものを指しているのか、ラベルを格納した変数を指しているのかを明示する意味で ラベルそのものを指定する時はアスタリスクから書かなければならないようになりました。
 1
 2
 3
 4
 5
	pos 50, 50 : button "終了する", *exit // goto処理でexitラベルにジャンプする
	stop

*exit
	end
 1
 2
 3
 4
 5
 6
	lbl = *exit
	pos 50, 50 : button "終了する", lbl // goto処理で変数lbl内のラベル先にジャンプする
	stop

*exit
	end
gosub処理例は次の通り。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
	pos 50, 50 : button gosub "終了する", *exit
	count = 10
	pos 10, 20 : mes "残り" + count + "秒で爆発します!"
	repeat
		redraw 0
		color 255, 255, 255 : boxf 200, 20, 220, 40
		if count < 0 : break
		if count < 4 : color 255 : else : color , , 255
		pos 200, 20 : mes count
		redraw
		count--
		wait 100
	loop
	color , 200
	pos 200, 20 : mes "ウッソ〜ン。"
	redraw
	stop

*exit
	dialog "起爆解除しますか?", 2, "確認"
	if stat = 7 : return // 元の位置に戻る(カウント中ならカウント処理を再開)
	end
HSP2にボタン上に画像を貼り付けるbtnimg命令がありましたが、 別途DLLを用意する必要はないものの、非標準命令でありllmod.asとmisc.asのインクルードが必要で、 さらには、画像を貼り付けるとボタン上の文字列(キャプションテキスト)が隠れてしまうというものでした。 HSP3.2からは標準命令として画像を貼り付けられるカスタムボタンを配置できるようになり、 画像を貼り付けてもボタン上のメッセージは消えないので、テキストを含んだ画像を用意する必要ありません。 また、ボタン上にマウスカーソルが乗った時に自動的に別の画像に変更することや、 ボタンを押されているタイミングの画像を自動的に表示させることも可能となっています。
objimage ウィンドウID, 通常X, 通常Y, 押下X, 押下Y, ホバーX, ホバーY
ウィンドウID予め読み込んだ画像のあるウィンドウIDを指定する。
通常X配置するボタン画像の基点となる読込元X座標を指定する。
通常Y配置するボタン画像の基点となる読込元Y座標を指定する。
押下Xボタンが押された時の画像の基点となる読込元X座標を指定する。
押下Yボタンが押された時の画像の基点となる読込元Y座標を指定する。
ホバーXマウスオーバー時の画像の基点となる読込元X座標を指定する。
ホバーYマウスオーバー時の画像の基点となる読込元Y座標を指定する。
上記書式のようにobjimage命令は以後のbutton命令で配置するボタンの背景画像を設定する命令であり、 画像を貼り付けたカスタムボタンを配置する命令ではありません。 ノーマル時の画像、押下時の画像、ホバー時の画像読込元は、位置をそれぞれ指定できますが、 共通のバッファでなければなりません。 値を省略することも可能で、例えばノーマル時の背景画像しか設定してない場合は、 押下時、ホバー時の画像もノーマル時の画像が利用されます。 ホバー時の画像設定だけを省略した場合、ホバー時はノーマル時の画像が使用されます。 いずれも開始位置だけの設定で、貼り付けるサイズの設定部分はありませんが、 貼り付けるサイズは配置するボタンのサイズとなります。 もし、貼り付けようとしている画像のウィンドウサイズがボタンサイズよりも小さい場合、 ボタンの右または下の空いた部分はグレーで表示されることになります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
	size = 320, 100
	// ボタン画像
	buffer 1, size.0, size.1 * 3
	color 240, 240, 200 : boxf size.0 * 0, size.1 * 0, size.0 * 1, size.1 * 1
	color 200, 240, 240 : boxf size.0 * 0, size.1 * 1, size.0 * 1, size.1 * 2
	color 240, 200, 240 : boxf size.0 * 0, size.1 * 2, size.0 * 1, size.1 * 3
	// ボタン設定
	gsel 0
	font msgothic, size.1 * 2 / 3
	objmode 2
	objsize size.0, size.1
	objimage 1, , , , size.1, , size.1 * 2
	// ボタン配置
	pos 50, 50 : button "終 了", *exit
	stop

*exit
	end
必要とされていないためか設定したカスタムボタンの情報を取得する命令は用意されてないので、 後から参照する必要がある場合は予め情報を変数に保持させておくか、 コチラに載せてある方法で取得すると良いでしょう。 続いて、チェックボックスを配置する命令を説明しましょう。
chkbox チェックボックス上の表記, 状態保持変数
チェックボックス上の表記チェックボックスのキャプション内容。
状態保持変数チェック状態を保持する変数。
チェックボックス上の表記は、ボタン同様にチェックボックス横に表示させるテキストのことです。 デフォルトではチェックボックスの右側にテキストが表示されており、 テキストをチェックボックスの左側にすることもできますが、標準命令では出来ないので説明しません。 チェック保持変数は、チェックされている時には1が、されてない時には0がセットされます。 変数は配列変数の1要素でも構いませんが、同一要素または同一変数を割り当てないようにしてください。 同一変数を割り当てた場合、最終のチェック結果がセットされます。 最終とは、一番最後のチェックボックスと言う意味ではなく、 チェックボックスに行った最後の処理を指します。 例えば、2つのチェックボックスに同一変数を割り当てた場合、 チェックを付けるとチェックあり状態となり、もう1つにチェックを付けてもチェックあり状態のまま。 そのうちの片方のチェックを外すと、もう片方のチェックは付いたままでもチェックなし状態になります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
	dim stt, 10
	repeat 10
		pos 50, cnt * 30 + 50 : chkbox "" + (cnt + 1), stt.cnt // チェックボックスを配置する
	loop
	pos 300, 50 : button "確認", *check
	stop

*check
	s = ""
	repeat 10
		// チェックが付いている(=1)なら処理をする
		if stt.cnt {
			if s ! "" : s += "\n"
			s += "" + (cnt + 1) + "にチェックが付いてます。"
		}
	loop
	if s ! "" {
		dialog s
	} else {
		dialog "チェックは付いていません。"
	}
チェックボックスを配置するとボタン同様の背景色が自動的に付いています。 白いウィンドウ色にチェックボックス部分だけが異なる色で表示されると不細工ですね。 コレはcolor命令でその上から塗りつぶそうとしても、変わりません。 チェックボックス自体の背景色を変更することで回避可能なのですが、 標準命令では実現できない為にココでは説明しません。 チェックボックスの色を変えることは容易ではありませんが、 逆のHSPウィンドウの背景色をチェックボックスと同じ色に変える事は標準命令でできます。
syscolor カラーインデックス
カラーインデックス変更するシステムカラー番号。
syscolor命令はcolor命令同様に、カレントカラーを変更する命令です。 パラメータの値に次に示す値のいずれかを指定すると、 現在Windowsで設定している色に変更することが出来ます。
  説明
0スクロールバー軸
1デスクトップ
5ウィンドウ背景
6ウィンドウ枠
8ウィンドウ内のテキスト
12MDIアプリケーションの背景
2アクティブウィンドウのタイトルバー(グラデーションの場合、タイトルバーの左端)
27アクティブウィンドウのタイトルバー(グラデーションの場合、タイトルバーの右側)
3非アクティブウィンドウのタイトルバー(グラデーションの場合、タイトルバーの左端)
28非アクティブウィンドウのタイトルバー(グラデーションの場合、タイトルバーの右側)
10アクティブウィンドウの境界
11非アクティブウィンドウの境界
9アクティブウィンドウのタイトルバーのテキスト
19非アクティブウィンドウのタイトルバーのテキスト
4メニュー背景
7メニュー内のテキスト
29フラットメニュー時のハイライト表示するのに使用される(WindowsXP〜)
30フラットメニュー時のメニューバーの背景(WindowsXP〜)
13コントロール内における選択された項目
14コントロール内における選択された項目のテキスト
203Dオブジェクトの最も明るい(光源方向の縁用)
223Dオブジェクトの明るい(光源方向の縁用)
153Dオブジェクトの表面
163Dオブジェクトの影(光源の反対方向の縁用)
213Dオブジェクトの暗い影
17淡色状態(無効状態)のテキスト
18プッシュボタンのテキスト
23ツールチップコントロールのテキスト
24ツールチップコントロールの背景
26ホットトラックアイテム
25???
書いている順番は、カラーインデックス順ではないので見難いかもしれませんが、 番号の順番よりも、アイテムとしての順番の方を優先してみました。 番号順での確認は、ヘルプで見て置いてください。 さて、チェックボックス(その他オブジェクト)と同じカラーインデックスはと言うと、 3Dオブジェクトの表面色15がコレに該当します。 早速、サンプルを実行して確かめてみましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
	dim chk, 2
	syscolor 15 : boxf
	pos 100, 50 : chkbox "同色?", chk

*@
	if chk.0 ! chk.1 {
		if chk : dialog "チェックされました。" : else : dialog "チェックが外されました。"
		chk.1 = chk.0
	}
	wait 1
	goto *@b
ウィンドウ背景色もチェックボックスと同じ色になり目立たなくなりましたね。 サンプルでは、チェックが付けられたり、外されたりするとダイアログが表示されます。 コレは、ループでチェックボックスの状態を常に監視しているからなんですね。 chkbox命令はbutton命令と異なり、現在の処理を割り込んでくれないので、 チェックを付けたり外したりしてもイベントが発生せず、 前の状態から変わったのかそのままなのかが区別できないのです。 HSP3から登場した割込ウィンドウメッセージを取得する命令を使えば、 チェックボックスに触ったことを感知できるのでループで監視する必要はなくなります。 使い方は簡単ですが、内容が少し高度なので現段階では説明しません。 ボタンにしろチェックボックスにしろサイズが大変小さいもので、 文字数がサンプルのものよりも少し増えただけですぐに溢れてしまっていました。 オブジェクトの位置を自由に変更できるように、サイズを変更する命令もあります。
objsize 横幅, 高さ, Y方向の確保サイズ
横幅オブジェクトの幅。省略時は現在の設定を引き継ぐ。
高さオブジェクトの高さ。省略時は現在の設定を引き継ぐ。
Y方向の確保サイズ配置後の移動サイズ。
横幅と高さパラメータはそのまま、オブジェクトのサイズです。 テキストを配置すると、カレントポジションが自動的に文字高さ分下にずれます。 objsize命令の「Y方向の確保サイズ」は、テキスト同様、どれだけ下にカレントポジションを下げるかを オブジェクトの高さとは別に設定できるようになっているのです。 サイズを省略するか、オブジェクトの高さよりも小さくした場合、オブジェクトの高さが適用されます。 もし、オブジェクトを重ならせたい場合は、pos命令でその様に設定してください。 そのような状況があるのかは知りませんが…。
 1
 2
 3
 4
 5
 6
 7
 8
	objsize 320, 40, 100 // オブジェクトサイズ変更
	pos 160, 100
	chkbox "チェックボックスのチェック可能サイズが大きくなりました。", check
	button "ボタンサイズも同じです。", *finish
	stop

*finish
	end