HSP命令講座 <screen命令>

Last Update : 2008/09/xx

PR HSPの書籍 『逆引き HSP3プログラミング事典 応用編』

screen命令

 ウィンドウの初期化と表示を行う命令です。命令名はそのまま「スクリーン」から。

 HSPはデフォルトでウィンドウが表示されるようになってます。このウィンドウは「ウィンドウID0」が割り振られていて、640x480のウィンドウサイズです。関連するbgscr命令は、タイトルバーや外枠が存在しないウィンドウを表示します。

 実行ファイルの起動段階で、ウィンドウサイズとウィンドウの表示位置を指定する場合、screen命令を利用します。下のサンプルはウィンドウサイズでx方向で300ドット、y方向で200ドットの大きさになります。第2・3パラメータに指定します。

	screen 0, 300, 200

 第1パラメータはウィンドウID値です。ウィンドウID0以外は、HSP2の場合は2以降(1は欠番)、HSP3の場合は1以降を利用できます。そして、下のサンプルはモニタ画面の左上の隅にウィンドウが表示されることになります。第5・6パラメータが初期の表示位置になります。

	screen 0, 300, 200, , 0, 0

 screen命令はウィンドウの初期化として働く(cls命令に相当)ので、ウィンドウの状態を維持したまま単純にウィンドウサイズや表示位置を変更したい場合はwidth命令を利用します。ウィンドウID1以降のウィンドウを変更する場合は、gsel命令で操作先ウィンドウを切り替える必要があります。

 第4パラメータはウィンドウモードです。数値を組み合わせて利用できます。

モード 説明
通常のウィンドウ。(デフォルト)
1670万色中256色のパレットモード。ゲーム用。
非表示ウィンドウ。gsel命令で表示化可能。
サイズ固定ウィンドウ。ウィンドウID1以降用。
ツールウィンドウ。アイコンや最大化・最小化ボタンのないウィンドウ。
[HSP 3.0/3.1] クライエントエリア上部に表示化けのバグあり
16 クライエントエリア部分にへこみ枠のあるウィンドウ。

↑TOP↑

サンプルコード

 ウィンドウの表示位置を設定ファイルに保存して、次回起動時に表示位置として反映させるサンプルの一例です。設定ファイルの入出力はメモリノートパッド機能のnote〜命令を利用します。

 まず、現在のウィンドウの位置を設定ファイルに書き出す処理です。
 現在の操作先ウィンドウの左上座標は、ginfo関数(タイプ4・5)、またはマクロ定義のシステム変数ginfo_wx1とginfo_wy1で取得できます。onexit命令のラベルジャンプ先で設定ファイルを出力する処理を用意します。
 どのような書式でデータを保存させるかは自由です。ここではテキトーに「WinX」「WinY」というパラメータに数値を引っ付けてます。

//	ウィンドウ位置を設定ファイルに出力 (by Kpan)

	screen 0

	onexit *exit

	stop

*exit
	buf = "WinX="+ginfo(4)+"\nWinY="+ginfo(5)+"

	notesel buf
	notesave "lconfig.ini"

	end

 次に実行ファイル起動時に逆に設定ファイルを読み込んで、screen命令へと反映させる処理です。
 必ず最初にexist命令で設定ファイルの有無を確認します。初回起動時には存在しないファイルだからです。
 「WinX」「WinY」というパラメータからデータをどうやって切り出してくるかは自由です。note〜命令と文字列操作関連のinstr関数getstr命令strmid関数あたりを利用すればいいでしょう。
 取得した位置の数値は文字列データなので、screen命令に反映する時はint関数などで必ず数値型へと変換させます。(そのまま指定すると、エラー6「パラメータの型が違います」)

//	設定ファイルからウィンドウ位置の読み込み (by Kpan)

	exist "lconfig.ini"
	if strsize = -1 {
;		初回起動時はモニタ画面の中央に表示
		winx = (ginfo(20) - ginfo(10)) / 2
		winy = (ginfo(21) - ginfo(11)) / 2
	} else {
		sdim data
		sdim winpos, , 2

		notesel buf
		noteload "lconfig.ini"

;		適当なデータの切り出し処理
		repeat noteinfo(0)
			noteget data, cnt
			if instr(data, ,"WinX") != -1 : getstr winpos.0, data, 5
			if instr(data, ,"WinY") != -1 : getstr winpos.1, data, 5
		loop
	}

	screen 0, , , , int(winpos.0), int(winpos.1)

	mes "X:"+winpos.0+" / Y:"+winpos.1

↑TOP↑

screen命令のメモ (HSP3)

・サイズ可変ウィンドウ・最大化ウィンドウ
 ウィンドウID0は、マウスによるウィンドウ枠のドラッグでサイズ変更ができない固定ウィンドウです。最大化ウィンドウのボタンは灰色で押せません。ウィンドウID1以降はリサイズできるウィンドウになり、screen命令のモード指定でこれを変更できます。
 ウィンドウID0の場合、Win32 API関数を利用してウィンドウスタイルを変更することで、サイズ可変化ウィンドウへと切り替えできます。(→ HSP3 あれこれ ウィンドウ編

・ウィンドウの最小化・最大化
 スクリプトからウィンドウを最小化したり最大化したりするにはsendmsg命令を利用します。

・ウィンドウの最前面表示
 gsel命令を利用して他のウィンドウよりも常に前面に表示されるウィンドウへ切り替えできます。

・実行ファイル起動時のちらつき
 実行ファイルを起動すると、640x480のウィンドウが表示されて指定したサイズへと変動するシーン、指定位置へとウィンドウが移動するシーン、オブジェクトが設置されていくシーンが一瞬だけ見えてしまいます。
 下の手段で実行ファイルを作成して、人間の目に見えてもいい段階になったら、非表示状態のウィンドウをgsel命令で表示する処理を用意します。起動時のパフォーマンスアップの効果もあり一石二鳥です。

・タスクバーに表示されないウィンドウ
 基本的にウィンドウID0は必ずタスクバーに表示されます。ウィンドウID1以降のウィンドウは、screen命令のモード8(ツールウィンドウ)にすると表示されません。(→ 関連、ぷまさんのHSP Help Center

・ウィンドウを閉じる
 ウィンドウ(プログラム全体)を終了するにはend命令を利用しますが、特定のウィンドウIDだけ終了させることは不可能です。gsel命令でウィンドウを非表示にしてウィンドウを隠すことで"閉じる"処理にします。
 その際、終了時のラベルジャンプ先を指定するonexit命令を用意することで、ウィンドウID0とウィンドウID1以降の終了処理とを振り分けることができます。

↑TOP↑

〜HSP3 あれこれ〜
ウィンドウ | オブジェクト | ファイル | フォルダ | キーボード | マウス | メニュー | システム | 文字列 | COM | その他

Copyright © 2005-2011 ゲーム作成ソフトHSPの情報をいろいろと Let's HSP!. All rights reserved.