SDI Form/ActionList
テストデータの確認用に、C#でちょっとしたツールを作っていたんですが。
SDIっぽく作っていたんですが、ツールバーやメニューのEnable状態、ステータスバーのプロンプト更新なんかを真面目にやろうとするとチト面倒なんですよね(´Д`)
メニューに関してはまだDropDownOpeningがあるから良いんですけど、ツールバーやステータスバーをどうするか。
コマンドルーティングの仕組み、MFCのON_UPDATE_COMMAND_UI的なものが標準ではないわけで、そこをどう解決するのかという課題があるわけです。
各処理の実行後に個別にUIの更新なんかをやっていたら絶対漏れが出ますしね。
とりあえずはDocumentクラスにデータ更新時のイベントを用意して、そのObserverでUIの更新をやるような作りにする案が基本にあって。
もっとGenericにやりたい場合には、Application.Idleを利用してUIの更新を行う方法がありますが。
これで状態に応じたツールバーやメニューのEnableなんかの変更は出来るんですが。
イベント処理も含めて統一した処理でやりたい…っというわけで、.NET版のActionListを探してきました(・∀・)
http://blogs.ugidotnet.org/crad/articles/38329.aspx
中身を見てみると、UIの更新にはApplication.Idleを使用しています。
イベント処理に関しては、ターゲットComponentのClick、CheckStateChangeなんかのEventInfoを取得して、そこにAction自信のイベントハンドラを追加しています。
後はターゲットComponentがToolBarButtonの時にはそのParentのButtonClickにハンドラを追加したり、処理対象のContainerControl.KeyDownにイベントハンドラを追加してショートカットの処理なんかしていますね。
で、ふと気がついたんですが、今時ステータスバーにプロンプトの内容を表示はしないみたいですね(´・ω・`)
調べてみたら、Visual StudioやOffice 2003なんかはそんなことしてないし。*1
そもそもイマドキSDIベースでアプリも作らないか〜(´ω`)
*1:eMbeded Visual C++やOutlook Expressとか一昔前のアプリは表示していますけど