イベント処理

ここでは、ユーザーがGUIコンポーネントを操作した際に処理を行う、「イベント処理」について解説します。

- 目次 -

イベントとは

イベントとは、プログラムの外側から、プログラムに対して行われる操作の事です。 例えば、ユーザーがボタンをクリックする事や、マウスを動かす事、ウィンドウを閉じる事などが挙げられます。

GUIを備えたプログラムが、アプリケーション・ソフトウェアとして意味を持つためには、 イベントが発生した際に何らかの処理を実行しなければなりません。 さもなければ、GUIコンポーネントはただの飾りとなってしまいます。

イベントハンドラ関数

VCSSLを含む一般のプログラミング言語では、 イベントが発生すると、それに対応する関数がシステム側から呼ばれます。 このような関数の事を一般に「イベントハンドラ関数」と呼びます。 イベントハンドラ関数の内容はあらかじめ用意されているのではなく、 プログラマが独自に記述します。

イベントハンドラ関数の模式図。
イベントハンドラの概念図
「ボタンがクリックされる」などのイベントが発生すると、イベントハンドラ関数が実行される。

VCSSLでは、処理したいイベントの種類に応じて特定の関数名と引数を持たせると、 それが自動的にイベントハンドラ関数と見なされ、 イベント発生時に呼び出されます。呼び出し時の引数には、 イベントに関する情報が送られてきます。 イベントハンドラ関数の中身には、イベントが発生した際に行わせたい処理を記述します。 なお、VCSSLのイベントハンドラ関数は基本的にvoid型であり、戻り値を返しません。

ウィンドウイベント処理

ウィンドウに関するイベントを処理するには、以下のイベントハンドラ関数を使用します。

イベントハンドラ関数 引数 イベント
onWindowOpen int id ウィンドウが起動した際に呼び出されます。
onWindowClose int id ウィンドウが閉じた際に呼び出されます。
onWindowMove int id,
int x,
int y
ウィンドウが動いた際に呼び出されます。
onWindowResize int id,
int width,
int height
ウィンドウサイズが変わった際に呼び出されます。
onWindowShow int id ウィンドウが表示された際に呼び出されます。
onWindowHide int id ウィンドウが非表示になった際に呼び出されます。

引数のidには、イベントが発生したウィンドウのGUIコンポーネントIDが渡されます。 また、引数のwidth, heightには、それぞれウィンドウの幅、高さが渡されます。

ここで特に重要なのがonWindowClose関数です。 このイベントハンドラ関数内でexit命令をコールするようにすると、 一般的なソフトウェアのような「 ウィンドウを閉じると処理を終了する 」という機能を実現できます。

これまで、VCSSLプログラムを終了させるには、 VCSSLコンソールを手動で閉じるしかありませんでした。 しかし、ウィンドウを閉じればプログラムが自動終了するようにしておけば、 VCSSLコンソールは不要なので、hide( )命令で隠してしまっても問題ありません。

ボタンイベント処理

ボタンに関するイベントを処理するには、以下のイベントハンドラ関数を使用します。

イベントハンドラ関数 引数 イベント
onButtonClick int id,
string text
ボタンがクリックされた際に呼び出されます。

引数のidには、イベントが発生したボタンのGUIコンポーネントIDが渡されます。 また、引数のtextには、たボタンの文字列が渡されます。

セレクトフィールドイベント処理

セレクトフィールドに関するイベントを処理するには、以下のイベントハンドラ関数を使用します。

イベントハンドラ関数 引数 イベント
onSelectFieldClick int id,
string text
セレクトフィールドがクリックされ、項目が選択された際に呼び出されます。

引数のidには、イベントが発生したセレクトフィールドのGUIコンポーネントIDが渡されます。 また、引数のtextには、選択された項目名が渡されます。

チェックボックスイベント処理

チェックボックスに関するイベントを処理するには、以下のイベントハンドラ関数を使用します。

イベントハンドラ関数 引数 イベント
onCheckBoxClick int id,
bool state
チェックボックスがクリックされた際に呼び出されます。

引数のidには、イベントが発生したチェックボックスのGUIコンポーネントIDが渡されます。 また、引数のstateには、チェックボックスのON/OFF状態が渡されます。

キーイベント処理

GUIコンポーネント上でキーボードのキーを操作した際には、キーイベントが発生します。

ただし、キーイベントを利用するには注意が必要です。 それは、キー操作がどのGUIコンポーネントに対して行われるかという点に関してです。 キーイベントを利用するには、ウィンドウ上に、 テキストフィールドなどのキーボード入力を扱うGUIコンポーネントを配置してはいけません。 また、ボタンなどの特定のキー操作(ENTERなど)に反応するGUIコンポーネントの存在も考慮が必要です。

キーイベントを利用する際は、 ウィンドウ上に配置するのはなるべく テキストラベルかグラフィックスラベルのみに限定する事が推奨されます。

キーイベントを処理するには、以下のイベントハンドラ関数を使用します。

イベントハンドラ関数 引数 イベント
onKeyDown int id,
string key
キーが押された際に呼び出されます。引数keyには、キーラベルの文字列が格納されています。記号のキーは、記号の文字列に変換されます。
onKeyUp iint id,
string key
キーが離された際に呼び出されます。引数keyには、キーラベルの文字列が格納されています。記号のキーは、記号の文字列に変換されます。
onKeyDown int id,
int keyCode
キーが押された際に呼び出されます。引数keyCodeには、キーを区別するため、GUIライブラリに1対1で定義された値が格納されています。
onKeyUp iint id,
int keyCode
キーが離された際に呼び出されます。引数keyCodeには、キーを区別するため、GUIライブラリに1対1で定義された値が格納されています。

引数のidには、イベント発生対象のGUIコンポーネントIDが渡されます。

なお、2つめの引数は、string 型とint型の2通りがあります。 前者は、キーの表面に印字された(キーラベルの)文字列が格納されます。 例えば「A」のキーを押した際は ”A” が、「@」のキーを押した際は ”@” が格納されます。 それに対して後者は、キーに1対1で割り振られた整数値が格納され、 例えば「@」のキーを押した際はKEY_ATの値が格納されます。

前者と後者にはそれぞれメリットとデメリットがあります。 前者は比較的手軽に扱える上、 連続したキー入力内容をstring変数末尾に追記していくような処理に便利です。 反面、キー判別に key == "DOWN" といったリテラルの文字列比較を多用するのはミスタイプに弱く、 厳格性に欠けるため、大きなプログラムでは好ましくありません。 それに対して後者は、厳格な記述が可能ですが、 小さなプログラムでは記述が面倒になる場合があります。

文字列 キーコード 文字列 キーコード
A〜Z KEY_A〜KEY_Z 0〜9 KEY_0〜KEY_9
F1〜F12 KEY_F1〜KEY_F12 @ KEY_AT
/ KEY_SLASH
ENTER KEY_ENTER + KEY_PLUS
SPACE KEY_SPACE - KEY_MINUS
TAB KEY_TAB , KEY_COMMA
SHIFT KEY_SHIFT . KEY_PERIOD
CONTROL KEY_CONTROL ALT KEY_ALT
; KEY_SEMICOLON [ KEY_LEFT_SQUARE_BRACKET
^ KEY_CIRCUMFLEX ] KEY_RIGHT_SQUARE_BRACKET
UP KEY_UP DOWN KEY_DOWN
LEFT KEY_LEFT RIGHT KEY_RIGHT

マウスウイベント処理

GUIコンポーネント上でマウスを動かしたり、 クリックしたりすると、マウスイベントが発生します。 マウスイベントを処理するには、以下のイベントハンドラ関数を使用します。

マウス操作は行えるアクションが多彩なので、 それに応じてイベントハンドラも様々なものが用意されています。

イベントハンドラ関数 引数 イベント
onMouseOver int id,
int x,
int y
マウスがコンポーネント領域内に入った際に呼び出されます。引数x, y には、コンポーネントの左上を原点とするマウスカーソル座標が格納されます。
onMouseOut int id,
int x,
int y
マウスがコンポーネント領域外に出た際に呼び出されます。引数x, y には、コンポーネントの左上を原点とするマウスカーソル座標が格納されます。
onMouseMove iint id,
int x,
int y
マウスがコンポーネント領域内で動いた際に呼び出されます。引数x, y には、コンポーネントの左上を原点とするマウスカーソル座標が格納されます。
onMouseCkick int id,
int x,
int y,
int button,
int count

マウスのボタンがクリックされた際に呼び出されます。具体的には、環境に設定された短い時間内で、マウスボタンが「 押し離し 」された場合に呼ばれます。

引数buttonには、押されたボタンを区別するため、GUIライブラリに定義された値が格納されます。定数値は、右, 左, 中央ボタンがそれぞれMOUSE_RIGHT, MOUSE_LEFT, MOUSE_MIDDLEという名称です。

最後の引数countは、連続して押し離しされた回数が格納されます。つまりシングルクリックなら1、ダブルクリックなら2となります。この値は、GUIライブラリにもそれぞれMOUSE_SINGLE, MOUSE_DOUBLEと定義されており、比較などで用いるとミスタイプを防げます。

onMouseDown int id,
int x,
int y,
int button
マウスのボタンが押された際に呼び出されます。引数buttonには、押されたボタンを区別するため、GUIライブラリに定義された値が格納されます。定数値は、右, 左, 中央ボタンがそれぞれMOUSE_RIGHT, MOUSE_LEFT, MOUSE_MIDDLEという名称です。
onMouseUp int id,
int x,
int y,
int button
マウスのボタンが離された際に呼び出されます。引数buttonには、押されたボタンを区別するため、GUIライブラリに定義された値が格納されます。定数値は、右, 左, 中央ボタンがそれぞれMOUSE_RIGHT, MOUSE_LEFT, MOUSE_MIDDLEという名称です。
onMouseDrag int id,
int x,
int y,
int button
マウスのいずれかのボタンがドラッグされた際に呼び出されます。引数buttonには、押されたボタンを区別するため、GUIライブラリに定義された値が格納されます。定数値は、右, 左, 中央ボタンがそれぞれMOUSE_RIGHT, MOUSE_LEFT, MOUSE_MIDDLEという名称です。
onMouseScroll int id,
int degree
マウスホイールが操作された際に呼び出されます。引数degreeにはホイール回転量が渡されます。

引数のidには、イベント発生対象のGUIコンポーネントIDが渡されます。 また、引数のx,yには、GUIコンポーネント左上頂点から見たマウスカーソルの位置座標が渡されます。

プログラム例

実際に各種イベントハンドラ関数を使用してみましょう。 以下のように記述し、実行してみてください。

EventSample.vcssl

このプログラムを実行すると、ウィンドウが表示され、その上に様々なGUIコンポーネントが表示されます。 各GUIコンポーネントを操作すると、それに応じた処理が実行されます。

実行結果の図。
実行結果
※この画像は模式図です。実際のGUIデザインは、オペレーティングシステムの種類や、VCSSL処理システムのバージョン、その他環境によって異なります。