イベント処理
ここでは、ユーザーが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コンポーネント左上頂点から見たマウスカーソルの位置座標が渡されます。
プログラム例
実際に各種イベントハンドラ関数を使用してみましょう。 以下のように記述し、実行してみてください。
このプログラムを実行すると、ウィンドウが表示され、その上に様々なGUIコンポーネントが表示されます。 各GUIコンポーネントを操作すると、それに応じた処理が実行されます。
