メッセージのトラップ
メッセージ処理の変更 への移動
ある状況下では、コンポーネントでメッセージを無視した方がよい場合があります。 つまり、コンポーネントがメッセージを自分のハンドラにディスパッチしないようにするわけです。 メッセージをトラップするには、仮想メソッド WndProc をオーバーライドします。
VCL コンポーネントの場合、WndProc メソッドでは、メッセージを選別してから Dispatch メソッドに渡します。Dispatch メソッドでは、メッセージを処理できるメソッドを決定します。コンポーネントでは、WndProc をオーバーライドすることにより、ディスパッチする前にメッセージを選別する機会が得られます。TWinControl から派生したコントロールの場合、WndProc のオーバーライドは次のようなコードになります。
procedure TMyControl.WndProc(var Message: TMessage); begin { tests to determine whether to continue processing } inherited WndProc(Message); end;
void __fastcall TMyControl::WndProc(TMessage& Message) { // tests to determine whether to continue processing if(Message.Msg != WM_LBUTTONDOWN) }
TControl コンポーネントでは、ユーザーがコントロールをドラッグ アンド ドロップしているときに除外されるマウス メッセージがすべて定義されています。WndProc をオーバーライドすることは、次の 2 点で役に立ちます。
- メッセージごとにハンドラを指定しなくても、一定範囲のメッセージを除外できる。
- メッセージのディスパッチを完全に阻止して、ハンドラが決して呼び出されないようにすることができる。