イベントを捕まえる方は色々あるようですが、
コントロールの派生クラスなら
On〜メソッドを
オーバーライドすると非常に簡単です。
次の例では、フォームをマウスでクリックすると背景色が変わります。
event1.js
--------------------------------------------------------
import System;
import System.Windows.Forms;
import System.Drawing;
var f : MyForm = new MyForm();
f.ShowDialog();
class MyForm extends Form {
function MyForm() {
...
}
//OnClickメソッドをオーバーライド
protected override function OnClick(e : EventArgs) {
if(BackColor != Color.Red)
BackColor = Color.Red;
else
BackColor = Color.Blue;
}
}
このように
OnClickメソッドをオーバーライドすると、
Clickイベントを捕まえることができます。
オーバーライドなので必ず次のように書いてください。
protected override function OnClick(e : EventArgs)
overrideは省略可です。
OnClickではなく、
OnMouseDown
・
OnMouseUp
を使うとより細かな制御ができます。
次の例は、フォームをクリックすると何か処理が行われるのですが、
押すボタンによってそれが変わります。
event2.js
---------------------------------------------------------------
...
class MyForm extends Form {
...
protected override function OnMouseUp(e : MouseEventArgs) {
switch(e.Button) {
case MouseButtons.Left: //左ボタンが押された
MessageBox.Show(e.X + "," + e.Y); //クリックされた座標
break;
case MouseButtons.Middle: //中央ボタンが押された
if(BackColor != Color.Red)
BackColor = Color.Red;
else
BackColor = Color.Blue;
break;
case MouseButtons.Right: //右ボタンが押された
print(e.Clicks); //クリックされた回数
break;
default:
break;
}
}
}
OnMouseUp・
OnMouseDown・
OnMouseMove
メソッドの引数には、マウスイベントの情報が格納されます。
その、
Button
プロパティにはどのボタンが押されたかが格納されます。
MouseButtons.
Left
なら、左ボタンが押された、という具合です。
X・
Y
プロパティにはクリックされた位置の
そのコントロールにおける座標が格納されます。
Clicks
プロパティには何回クリックされたかが格納されます。
しかし、ダブルクリックはどうやって検出すべきかがわからない。
キーを押したときのイベントは次のように処理します。
次の例は、Alt+R、Cntl+B、Shift+G、Yを押したとき、
背景色がそれぞれ、Red、Blue、Green、Yellowになるものです。
event3.js
-----------------------------------------------------------
...
class MyForm extends Form {
...
protected override function OnKeyUp(e : KeyEventArgs) {
switch(e.Modifiers) {
case Keys.Alt:
if(e.KeyCode == Keys.R)
BackColor = Color.Red;
break;
case Keys.Control:
if(e.KeyCode == Keys.B)
BackColor = Color.Blue;
break;
case Keys.Shift:
if(e.KeyCode == Keys.G)
BackColor = Color.Green;
break;
default:
if(e.KeyCode == Keys.Y)
BackColor = Color.Yellow;
break;
}
}
}
OnKeyUp・
OnKeyDown
メソッドの引数にはどんなキーが押されたか、
という情報が格納されます。
その、
Modifiers
プロパティは、どの修飾キーが押されたかを表します。
より具体的には、Altが押されていれば、Keys.Altという値を取る、などです。
KeyCode
プロパティは修飾キー以外のどのキーが押されたかを表します。
Aキーが押されていれば、Keys.Aという値を取る、などです。
次は、違う書きかたで同じ動作をするプログラムです。
protected override function OnKeyUp(e : KeyEventArgs) {
if(e.Alt) {
if(e.KeyCode == Keys.R)
BackColor = Color.Red;
}
else if(e.Control) {
if(e.KeyCode == Keys.B)
BackColor = Color.Blue;
}
else if(e.Shift) {
if(e.KeyCode == Keys.G)
BackColor = Color.Green;
}
else {
if(e.KeyCode == Keys.Y)
BackColor = Color.Yellow;
}
}
Alt、
Control、
Shift
プロパティはそれぞれ、Alt、Control、Shift
キーが押されたかをBooleanで返します。
もう一つ同じ動作をする例です。
protected override function OnKeyUp(e : KeyEventArgs) {
if(e.KeyData & Keys.Alt) {
if((e.KeyData & Keys.KeyCode) == Keys.R)
BackColor = Color.Red;
}
else if(e.KeyData & Keys.Control) {
if((e.KeyData & Keys.KeyCode) == Keys.B)
BackColor = Color.Blue;
}
else if(e.KeyData & Keys.Shift) {
if((e.KeyData & Keys.KeyCode) == Keys.G)
BackColor = Color.Green;
}
else {
if((e.KeyData & Keys.KeyCode) == Keys.Y)
BackColor = Color.Yellow;
}
}
KeyData
プロパティは修飾キーも含めてキーの情報を表します。
内部的には、8バイトの整数で、上4バイトが修飾キー、
下4バイトが他のキーになっているようです。
Keys.Alt とビット積を取ると、Alt キーが押されていたかどうかが分かります。
Keys.
Modifiers
とビット積を取ると、上4バイトを取り出せて、
KeyEventArgs の Modifiers プロパティと同じことになります。
Keys.
KeyData
とビット積を取ると、下4バイトを取り出せて、
KeyEventArgs の KeyCode プロパティと同じことになります。
OnKeyPress
というメソッドもあります。
次の例では、押したキーに相当する文字を表示します。
event4.js
-------------------------------------------------------------------
...
class MyForm extends Form {
...
protected override function OnKeyPress(e : KeyPressEventArgs) {
MessageBox.Show(e.KeyChar);
}
}
OnKeyPress
メソッドの引数は、
KeyChar
というプロパティを持ち、
これは、押したキーが表示すべき文字を表します。
例えば、Caps Lock
されていて、A キーが押されていれば、"A"という文字になります。
Caps Lock
されていなければ、"a"という文字になります。
イベントの伝播は、たぶん、次のようにします。
event5.js
-------------------------------------------------------------
...
class MyForm extends Form {
var btn1 : MyButton;
function MyForm() {
...
btn1 = new MyButton();
...
Controls.Add(btn1);
}
//Bでなかったらここへくる
protected override function OnKeyDown(e : KeyEventArgs) {
BackColor = Color.Red;
}
}
//Buttonの派生クラス
class MyButton extends Button {
function MyButton() {
super();
}
protected override function OnKeyDown(e : KeyEventArgs) {
if(e.KeyData == Keys.B) //Bならここでイベントを処理する
Parent.BackColor = Color.Blue;
else
Parent.OnKeyDown(e); //親コンテナにイベントを発生させる
}
}
ボタンがアクティブの状態で何らかのキーを押したとき、
ボタンの OnKeyDown メソッドが実行されます。
このとき、そのキーが B でなかったら、
Parent.OnKeyDown(e);
として、親、すなわちフォームに KeyDown イベントを発生させます。