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 "マウスが移動しました" returnoncmdは、定義されたウィンドウによって、ジャンプするラベル先が異なります。このスクリプトの場合はラベルにいちいちウィンドウの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内を書き換えるだけでラベルを追加することもないので 難しく考えることなくスクリプトを組むことができます。