goo

oncmd


oncmd メモ
oncmd
Windowsメッセージ割り込み実行指定
oncmd goto/gosub *label,p1

*label : ラベル名
p1 : メッセージID


1. アクティブであるウィンドウIDに対して指定される。
アクティブウィンドウIDを把握しておく必要がある。不明な場合は、「gsel」命令で変更すること。

2 同じメッセージIDを複数回指定した場合、最後に指定したものが登録される。
他のウィンドウのメッセージIDの登録を削除しない用に気をつけること。(上記1参照)

3 メッセージ割り込みは、「stop」,「wait」,「await」命令の処理中に発生する。
例えば「wait 1000」で10秒waitした時に、割り込みが発生した場合、10秒待つことなくwait処理を終了して割り込みを発生させる。
また、短時間で終わる処理で、割り込みを発生させたくない場合は上記命令を使用しないこと。

4 oncmd 0 と oncmd 1
「oncmd 0」は、全てのウィンドウの全ての割り込みを停止させる。
「oncmd 1」は、全てのウィンドウの全ての割り込みを再開させる。
一度登録された割り込みは消すことができない。もし、任意のメッセージ割り込みを変更したい場合はダミーを登録する方法がある。以下、テストサンプル。

割り込み変更
#define WM_LBUTTONDOWN 0x0201

	screen 0, 150, 150
	flagL = 0 : objsize 150, 24
	button gosub "左クリック割り込み停止", *btn1
	oncmd gosub *On_LButtonDown, WM_LBUTTONDOWN
	stop

*btn1
	if( flagL ){
		oncmd gosub *On_LButtonDown, WM_LBUTTONDOWN
		objprm 0, "左クリック割り込み停止"
	}
	else{
		oncmd gosub *On_Dummy, WM_LBUTTONDOWN
		objprm 0, "左クリック割り込み再開"
	}
	flagL ^= 1
	return

*On_Dummy
	return

*On_LButtonDown
	dialog "*On_LButtonDown"
	return


5 goto と gosub
gotoの場合には、単純なプログラムジャンプ。 gosubの場合はサブルーチンジャンプを行ないます。(ヘルプ引用)
同じウィンドウ、メッセージIDで、「goto」と「gosub」は同時に登録できない。
「goto」はHSP内部処理後、「gosub」はHSP内部処理前、に割り込みが発生する。
「gosub」で「return」に戻り値を指定した場合は、HSP内部処理ではなく、デフォルトのウインドゥプロシージャーが処理を行う。以下、テストサンプル。

goto
/*
	oncmd goto の場合
	ボタンが押された場合、*btn から *On_Command へと処理される
 */
#define WM_COMMAND 0x0111
#define BN_CLICKED 0

	screen 0, 150, 150
	button gosub "goto", *btn : hBtn = objinfo(stat, 2)
	oncmd goto *On_Command, WM_COMMAND
	stop

*btn
	dialog "*btn"
	return

*On_Command
	if( lparam == hBtn ){
		hw = wparam >> 16
		if( hw == BN_CLICKED ){
			dialog "*On_Command : BN_CLICKED"
		}
	}
	stop


gosub
/*
	oncmd gosub の場合
	ボタンが押された場合、*On_Command から *btn へと処理される
 */
#define WM_COMMAND 0x0111
#define BN_CLICKED 0

	screen 0, 150, 150
	button gosub "gosub", *btn : hBtn = objinfo(stat, 2)
	oncmd gosub *On_Command, WM_COMMAND
	stop

*btn
	dialog "*btn"
	return

*On_Command
	if( lparam == hBtn ){
		hw = wparam >> 16
		if( hw == BN_CLICKED ){
			dialog "*On_Command : BN_CLICKED"
		}
	}
	return


gosub return 0
/*
	oncmd gosub の場合
	ボタンが押された場合、*On_Command から
	デフォルトプロシージャ へと処理される
	今回の場合は、*btnの処理が行われない
 */
#define WM_COMMAND 0x0111
#define BN_CLICKED 0

	screen 0, 150, 150
	objsize 150, 24
	button gosub "gosub return 0", *btn : hBtn = objinfo(stat, 2)
	oncmd gosub *On_Command, WM_COMMAND
	stop

*btn
	dialog "*btn"
	return

*On_Command
	if( lparam == hBtn ){
		hw = wparam >> 16
		if( hw == BN_CLICKED ){
			dialog "*On_Command : BN_CLICKED"
		}
	}
	return 0


メッセージ
WM_NULL			0x0000
WM_CREATE			0x0001
WM_DESTROY			0x0002
WM_MOVE			0x0003
WM_SIZE			0x0005
WM_ACTIVATE		0x0006
WM_SETFOCUS		0x0007
WM_KILLFOCUS		0x0008
WM_ENABLE			0x000A
WM_SETREDRAW		0x000B
WM_SETTEXT			0x000C
WM_GETTEXT			0x000D
WM_GETTEXTLENGTH		0x000E
WM_PAINT			0x000F
WM_CLOSE			0x0010
WM_QUERYENDSESSION		0x0011
WM_QUERYOPEN		0x0013
WM_ENDSESSION		0x0016
WM_QUIT			0x0012
WM_ERASEBKGND		0x0014
WM_SYSCOLORCHANGE		0x0015
WM_SHOWWINDOW		0x0018
WM_WININICHANGE		0x001A
WM_DEVMODECHANGE		0x001B
WM_ACTIVATEAPP		0x001C
WM_FONTCHANGE		0x001D
WM_TIMECHANGE		0x001E
WM_CANCELMODE		0x001F
WM_SETCURSOR		0x0020
WM_MOUSEACTIVATE		0x0021
WM_CHILDACTIVATE		0x0022
WM_QUEUESYNC		0x0023
WM_GETMINMAXINFO		0x0024
WM_PAINTICON		0x0026
WM_ICONERASEBKGND		0x0027
WM_NEXTDLGCTL		0x0028
WM_SPOOLERSTATUS		0x002A
WM_DRAWITEM		0x002B
WM_MEASUREITEM		0x002C
WM_DELETEITEM		0x002D
WM_VKEYTOITEM		0x002E
WM_CHARTOITEM		0x002F
WM_SETFONT			0x0030
WM_GETFONT			0x0031
WM_SETHOTKEY		0x0032
WM_GETHOTKEY		0x0033
WM_QUERYDRAGICON		0x0037
WM_COMPAREITEM		0x0039
WM_GETOBJECT		0x003D
WM_COMPACTING		0x0041
WM_COMMNOTIFY		0x0044
WM_WINDOWPOSCHANGING		0x0046
WM_WINDOWPOSCHANGED		0x0047
WM_POWER			0x0048
WM_COPYDATA		0x004A
WM_CANCELJOURNAL		0x004B
WM_NOTIFY			0x004E
WM_INPUTLANGCHANGEREQUEST	0x0050
WM_INPUTLANGCHANGE		0x0051
WM_TCARD			0x0052
WM_HELP			0x0053
WM_USERCHANGED		0x0054
WM_NOTIFYFORMAT		0x0055
WM_CONTEXTMENU		0x007B
WM_STYLECHANGING		0x007C
WM_STYLECHANGED		0x007D
WM_DISPLAYCHANGE		0x007E
WM_GETICON			0x007F
WM_SETICON			0x0080
WM_NCCREATE		0x0081
WM_NCDESTROY		0x0082
WM_NCCALCSIZE		0x0083
WM_NCHITTEST		0x0084
WM_NCPAINT			0x0085
WM_NCACTIVATE		0x0086
WM_GETDLGCODE		0x0087
WM_SYNCPAINT		0x0088
WM_NCMOUSEMOVE		0x00A0
WM_NCLBUTTONDOWN		0x00A1
WM_NCLBUTTONUP		0x00A2
WM_NCLBUTTONDBLCLK		0x00A3
WM_NCRBUTTONDOWN		0x00A4
WM_NCRBUTTONUP		0x00A5
WM_NCRBUTTONDBLCLK		0x00A6
WM_NCMBUTTONDOWN		0x00A7
WM_NCMBUTTONUP		0x00A8
WM_NCMBUTTONDBLCLK		0x00A9
WM_NCXBUTTONDOWN		0x00AB
WM_NCXBUTTONUP		0x00AC
WM_NCXBUTTONDBLCLK		0x00AD
WM_INPUT			0x00FF
WM_KEYFIRST		0x0100
WM_KEYDOWN			0x0100
WM_KEYUP			0x0101
WM_CHAR			0x0102
WM_DEADCHAR		0x0103
WM_SYSKEYDOWN		0x0104
WM_SYSKEYUP		0x0105
WM_SYSCHAR			0x0106
WM_SYSDEADCHAR		0x0107
WM_UNICHAR			0x0109
WM_KEYLAST			0x0109
WM_KEYLAST			0x0108
WM_IME_STARTCOMPOSITION	0x010D
WM_IME_ENDCOMPOSITION		0x010E
WM_IME_COMPOSITION		0x010F
WM_IME_KEYLAST		0x010F
WM_INITDIALOG		0x0110
WM_COMMAND			0x0111
WM_SYSCOMMAND		0x0112
WM_TIMER			0x0113
WM_HSCROLL			0x0114
WM_VSCROLL			0x0115
WM_INITMENU		0x0116
WM_INITMENUPOPUP		0x0117
WM_MENUSELECT		0x011F
WM_MENUCHAR		0x0120
WM_ENTERIDLE		0x0121
WM_MENURBUTTONUP		0x0122
WM_MENUDRAG		0x0123
WM_MENUGETOBJECT		0x0124
WM_UNINITMENUPOPUP		0x0125
WM_MENUCOMMAND		0x0126
WM_CHANGEUISTATE		0x0127
WM_UPDATEUISTATE		0x0128
WM_QUERYUISTATE		0x0129
WM_CTLCOLORMSGBOX		0x0132
WM_CTLCOLOREDIT		0x0133
WM_CTLCOLORLISTBOX		0x0134
WM_CTLCOLORBTN		0x0135
WM_CTLCOLORDLG		0x0136
WM_CTLCOLORSCROLLBAR		0x0137
WM_CTLCOLORSTATIC		0x0138
WM_MOUSEFIRST		0x0200
WM_MOUSEMOVE		0x0200
WM_LBUTTONDOWN		0x0201
WM_LBUTTONUP		0x0202
WM_LBUTTONDBLCLK		0x0203
WM_RBUTTONDOWN		0x0204
WM_RBUTTONUP		0x0205
WM_RBUTTONDBLCLK		0x0206
WM_MBUTTONDOWN		0x0207
WM_MBUTTONUP		0x0208
WM_MBUTTONDBLCLK		0x0209
WM_MOUSEWHEEL		0x020A
WM_XBUTTONDOWN		0x020B
WM_XBUTTONUP		0x020C
WM_XBUTTONDBLCLK		0x020D
WM_MOUSELAST		0x020D
WM_MOUSELAST		0x020A
WM_MOUSELAST		0x0209
WM_PARENTNOTIFY		0x0210
WM_ENTERMENULOOP		0x0211
WM_EXITMENULOOP		0x0212
WM_NEXTMENU		0x0213
WM_SIZING			0x0214
WM_CAPTURECHANGED		0x0215
WM_MOVING			0x0216
WM_POWERBROADCAST		0x0218
WM_DEVICECHANGE		0x0219
WM_MDICREATE		0x0220
WM_MDIDESTROY		0x0221
WM_MDIACTIVATE		0x0222
WM_MDIRESTORE		0x0223
WM_MDINEXT			0x0224
WM_MDIMAXIMIZE		0x0225
WM_MDITILE			0x0226
WM_MDICASCADE		0x0227
WM_MDIICONARRANGE		0x0228
WM_MDIGETACTIVE		0x0229
WM_MDISETMENU		0x0230
WM_ENTERSIZEMOVE		0x0231
WM_EXITSIZEMOVE		0x0232
WM_DROPFILES		0x0233
WM_MDIREFRESHMENU		0x0234
WM_IME_SETCONTEXT		0x0281
WM_IME_NOTIFY		0x0282
WM_IME_CONTROL		0x0283
WM_IME_COMPOSITIONFULL	0x0284
WM_IME_SELECT		0x0285
WM_IME_CHAR		0x0286
WM_IME_REQUEST		0x0288
WM_IME_KEYDOWN		0x0290
WM_IME_KEYUP		0x0291
WM_MOUSEHOVER		0x02A1
WM_MOUSELEAVE		0x02A3
WM_NCMOUSEHOVER		0x02A0
WM_NCMOUSELEAVE		0x02A2
WM_WTSSESSION_CHANGE		0x02B1
WM_TABLET_FIRST		0x02c0
WM_TABLET_LAST		0x02df
WM_CUT			0x0300
WM_COPY			0x0301
WM_PASTE			0x0302
WM_CLEAR			0x0303
WM_UNDO			0x0304
WM_RENDERFORMAT		0x0305
WM_RENDERALLFORMATS		0x0306
WM_DESTROYCLIPBOARD		0x0307
WM_DRAWCLIPBOARD		0x0308
WM_PAINTCLIPBOARD		0x0309
WM_VSCROLLCLIPBOARD		0x030A
WM_SIZECLIPBOARD		0x030B
WM_ASKCBFORMATNAME		0x030C
WM_CHANGECBCHAIN		0x030D
WM_HSCROLLCLIPBOARD		0x030E
WM_QUERYNEWPALETTE		0x030F
WM_PALETTEISCHANGING		0x0310
WM_PALETTECHANGED		0x0311
WM_HOTKEY			0x0312
WM_PRINT			0x0317
WM_PRINTCLIENT		0x0318
WM_APPCOMMAND		0x0319
WM_THEMECHANGED		0x031A
WM_HANDHELDFIRST		0x0358
WM_HANDHELDLAST		0x035F
WM_AFXFIRST		0x0360
WM_AFXLAST			0x037F
WM_PENWINFIRST		0x0380
WM_PENWINLAST		0x038F
WM_APP			0x8000
WM_USER			0x0400
コメント ( 2 ) | Trackback ( 0 )
« システムエラ... DirectX D3D9 ... »
 
コメント
 
 
 
こんにちは (FenlIl)
2008-09-24 17:08:20
見ていてすごいと思いました。
oncmd命令はまるで使ったことが無かったのですが、
今回これを参考に使用してみようと思います。
こちらでもHSPのゲーム製作ブログをやっているので、ぜひ来てください。
 
 
 
Re: こんにちは (hiro)
2008-09-26 07:59:36
レスありがとうございます。
「oncmd」でプログラミングの幅が増えて便利かなと思いつつサンプルと共に書いてみました。


> こちらでもHSPのゲーム製作ブログをやっているので、ぜひ来てください。

ChainCrystal完成おめでとうございます。
機会あれば、遊んでみたいと思います。
 
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。