JScript.NET  新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
Written 10/21/03
JScript.NET
イベント
イベントを捕まえる
イベントを捕まえる方は色々あるようですが、 コントロールの派生クラスなら 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ではなく、OnMouseDownOnMouseUp を使うとより細かな制御ができます。
次の例は、フォームをクリックすると何か処理が行われるのですが、 押すボタンによってそれが変わります。
    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;
            }
        }
    }
 
OnMouseUpOnMouseDownOnMouseMove メソッドの引数には、マウスイベントの情報が格納されます。
その、Button プロパティにはどのボタンが押されたかが格納されます。 MouseButtons.Left なら、左ボタンが押された、という具合です。
XY プロパティにはクリックされた位置の そのコントロールにおける座標が格納されます。
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;
            }
        }
    }
 
OnKeyUpOnKeyDown メソッドの引数にはどんなキーが押されたか、 という情報が格納されます。
その、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;
        }
    }
 
AltControlShift プロパティはそれぞれ、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 イベントを発生させます。
JScript.NET exit