HSP Tips

oncmd

omcndのラベルの名前の指定の仕方

oncmdとは?

 oncmdとは、HSPウィンドウメッセージを取得するための命令です。
 このページでは、ウィンドウメッセージの知識があることを前提で、oncmdの使用方法を説明していきます。

gosubを必ず付ける

oncmd gosub ON_******,******
 oncmdは、基本的に後ろにgosubをつけて書きます。ウィンドウメッセージはウィンドウプロシージャから送られ、基本的に戻り値を返さないといけません。
 HSPのランタイムでは構造的にはgosubを付けていなくても、戻り値を返してはいるのですが、もともとのウィンドウメッセージの扱いと異なるので使いずらくなってしまいます。

ウィンドウメッセージとは?

#define global	WM_ACTIVATE			0x0006	//ウィンドウのアクティブ化・非アクティブ化	
#define global	WM_CHAR				0x0102	//キーボードからの文字の入力	
#define global	WM_CLEAR			0x0303	//エディットコントロールのテキストの削除 
#define global	WM_COMMAND			0x0111	//メニューアイテムの選択・コントロールからの通知	
#define global	WM_CONTEXTMENU		0x007B	//コンテキストメニューを表示するために受け取る通知	
#define global	WM_COPY				0x0301	//エディットコントロールのテキストのコピー		
#define global	WM_CUT				0x0300	//エディットコントロールのテキストの切り取り 
#define global	WM_DROPFILES		0x0233	//ファイルがドロップされた	
#define global	WM_GETFONT			0x0031	//コントロールのフォントを取得	
#define global	WM_GETICON			0x007F	//ウィンドウのアイコンを取得	
#define global	WM_GETTEXT			0x000D	//ウィンドウタイトルやコントロールのテキストを取得	
#define global	WM_GETTEXTLENGTH	0x000E	//ウィンドウタイトルやコントロールのテキストのサイズを取得	
#define global	WM_KEYDOWN			0x010	//非システムキーが押された	
#define global	WM_KEYUP			0x0101	//押されていた非システムキーが離された	 
#define global	WM_LBUTTONDBLCLK	0x0203	//マウス左ボタンをダブルクリック
.
.
.
 ウィンドウメッセージとは、コンピュータを使っている人がマウスを動かしたり、キーボードのキーを押したりすると、プロシージャメッセージとして知らせてくれるものです。
 メッセージには、様々な種類のものがあり、「マウスカーソルが移動した」、「左クリックを押した」、「右クリックを離した」などがあります。
 これらのメッセージが着たら、どんな処理をするのかを定義することによりプログラミングの幅や効率が大きく向上します。

 また、ウィンドウメッセージは“#define”にて定義されています。Cなどのプログラミング言語ではこれがたくさん定義されてあるファイルのことをヘッダファイルと呼び、最初から定義されているものなのですが、HSPにはこれがないため、ネットなどでウィンドウメッセージの定義ファイルを検索する必要があります。
 ウィンドウメッセージに関して参考になるサイトは、ちょくと氏ウィンドウメッセージリストのサイトがあります。
 ウィンドウメッセージの定義には、必ず先頭に“WM_”と書かれています。

ラベルの名前

 
oncmd gosub *?????,WM_MOUSEMOVE
 ウィンドウメッセージのWM_MOUSEMOVEは、マウスが移動したことを知らせるメッセージです。
 このoncmdは、マウスが移動すると指定したラベルへサブルーチンジャンプします。しかし、ここでひとつ、ラベル名を何にすればよいのかということに悩んでしまいます。
 ウィンドウメッセージと同じ名前にしても、エラーがでてしまうので同じ名前にすることは出来ません。かといって、ユニークな名前にしてしまうと、いったいこのラベルがどんなものなのかということが人目で理解することが出来なくなってしまいます。
 そこで、ラベルの名前にある決まった定型を定めることによって理解しやすいものにします。
oncmd gosub *ON_WM_MOUSEMOVE,WM_MOUSEMOVE
 この場合は、ラベル名に“ON_”という文字列を先頭に加えてみました。これなら、名前が衝突することもないし、いちいちユニークな名前を考える手間を省くことが出来ます。

ウィンドウが複数ある場合


screen 0
oncmd gosub *jump0,WM_MOUSEMOVE

screen 2
oncmd gosub *jump1,WM_MOUSEMOVE
stop

*jump0
	gsel 0
	mes "マウスが移動しました"
	
*jump1
	gsel 2
	mes "マウスが移動しました"
return
 oncmdは、定義されたウィンドウによって、ジャンプするラベル先が異なります。このスクリプトの場合はラベルにいちいちウィンドウのIDをつけてあげたり、描画先を変更しないといけないなど いろいろと面倒くさいことになっています。
 このままプログラムを書いていったら、どれがどのラベルなのか全く検討がつかなくなってしまうことになりかねません。
oncmd gosub *jump,WM_MOUSEMOVE

screen 2
oncmd gosub *jump,WM_MOUSEMOVE
stop



*jump

	gsel ginfo_intid
	switch ginfo_intid
		case 0
			mes "マウスが移動しました"
		swbreak
		
		case 2
			mes "マウスが移動しました"
		swbreak

	swend
return

 このようにginfo_intidにはoncmdで飛んできたウィンドウIDが入っているのでこれを利用してswitchで ウィンドウIDによって描画を変えています。
 これにより、ウィンドウによってそれぞれ異なる動作をcase~break内を書き換えるだけでラベルを追加することもないので 難しく考えることなくスクリプトを組むことができます。