(18) VB2003:Tabキーを拾えるTextBoxコントロールその後
検証環境 自作ATX(PenIII1.2GHz/GA-6VTXE/512MB)
WinXPPro(2002)SP2/VS.NET2003(7.1.3091) & .NET Framework1.1(1.1.4322SP1)/MSDN-Lib Oct,2004
泥Tips(6)の手法でおっけー、とか思っていたら、IMessageFilter.PreFilterMessageでWM_KEYDOWNメッセージを拾ってる人を発見しました。
Message.WParamでキーコードを取得して、Tabキー(&H09)だったらモジュールレベルのスコープを持つフラグ変数を立てておいて、TextBoxのLeaveイベントの中でそのフラグを参照してTab押下によるフォーカス移動かどぅかを判断してんですわ。
その手があったかー、と思うより先に、Formに来るメッセージを味噌もくそも一緒くたに処理しよぅとするPreFilterMessageの存在にものすごく疑問が。
確かにmsdnLibraryでは「このメソッドを使用すると、メッセージがディスパッチされる前に行う必要のあるコード作業も実行できます。」とか記述されてて、ButtonのClickコマンドを横取りするような例を挙げちゃっているわけで。
これを鵜呑みにすると、確かにTextBoxのキー押下も横取りできる、って発想はアリだよなぁ。
でも、コード間の脈絡がまったくなくなってしまぅので、フラグ変数名でコード内を検索するかデバッグトレースでもしない限り、操作から発生するイベント及びそこからCallされるプロシージャの流れと無関係なところで動作が制御されていることがわからなくなるんですよね。
これはデバッグ/メンテナンス時にかなりなツラさだと思ぅわけですよ。
C++で考えれば、ふつーコントロールへ流れてくるメッセージはコントロールの中でつかまえて処理するよなぁ。
Formで一律してメッセージをつかまえるってのはよっぽどのこと、てゅうか客先のわがまま要求に負けて泣く泣くへんてこな動作を作りこんだ時くらいしか覚えがありません。
まぁmsdnLibraryの例はわかりやすく説明したいがためにあんまり適切ではない例をつい出しちゃった、くらいに解釈しておいたとしても。
そもそPreFilterMessageって、何を想定して用意されたメソッドなんでしょぅ。
むちゃくちゃ泥臭い使い方しか思いつきませんよ?