見出し画像

マウスイベント処理のオーダーメイド

お絵かきソフトに於いて、ポインティングデバイスで出来ること(そしてケアすべきこと)は数多い。
描画はもちろん、選択、変形ツールのドラッグ、Viewの拡縮なんてのもある。
これをどう処理するか。素人プログラマーの長年の命題に挑戦する。

問題点

(※データに無関係なイベントはView内で完結させるのでここではMVVMは語らない)
各コントロールで対応されているマウスイベントを普通にコードビハインドで受け取るとこうなる。

        private void PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
       {
           //マウスが動いたときの処理
       }

規模が小さければこのまま書き込んでオワリにするが、先に述べたようにお絵かきツールではモードが多数ある。
それをこのメソッドで対応しようとすると…

        private void PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
       {
           switch(Mode)
           {
               case Mode.Select:
                   //選択時のマウスの動き
                   break;
               case Mode.Draw:
                   //描画時のマウスの動き
                   break;
               case Mode.Edit:
                   //編集時のマウスの動き
                   break;
                   .....
           }
       }

このように、モード分岐判定をかませることになる。
マウスが動くたびに、だ。
しかも、マウスが離れたとき、キーを押された時、空移動したとき、
すべてのイベントに於いてこのモード分岐判定を介入しなくてはいけない。
こんな無駄なロジックあるか???

考察

毎回IF処理…考えただけで虫唾が走る😫

イラスト

いっそモードを切り替えるたびにユーザーコントロールを切り替えるか?
いや、煩雑過ぎる。メンテなんか最悪だ。
要は、モードを変えるたびに、イベントを処理する定義コードがごっそり入れ替わってくれりゃいいんだよ。そんな方法…

イラスト2

Delegateだ!

イラスト3

まとめ

思いつきなので実際どうなるか分からんが、これがうまく行ったらプログラムの質が20%くらい上がりそうだ。
Delegateって便利だなー!
よし、やるぞ!

この記事が気に入ったらサポートをしてみませんか?