私は現在、純粋な WinAPI をクラスにラップする独自のミニ ビジュアル フレームワークを作成しています。
現在、メッセージを分析するプロセスは次のようになっています。
static
Application::Runにはメッセージ ループがあります。新しいメッセージを取得し、適切な WndProc にディスパッチします。私が作成するすべてのウィンドウは (WinAPI に関して) 同じクラスから作成されるため、同じ
WndProcものが呼び出されます。実際には、これは静的FormAPI::WndProcメソッドです。これは、メッセージがどのウィンドウを参照し、その を呼び出すかをチェックしますWndProc。Form::WndProcメッセージを分析するメソッドが呼び出されます。だとしWM_MOUSEMOVEます。そして を呼び出しProcessMouseMoveますDefWindowProc。この点を [1] として覚えておいてください。private
Form::ProcessMouseMoveはメッセージから実際のデータ (x、y、シフト状態など) を取得し、それを使用可能なデータに変換して protected を呼び出しますForm::OnMouseMove。最後に、protected
OnMouseMoveは、イベント ハンドラーが設定されているかどうか (つまり、std::function<void(Form *, int, int, ShiftState)>) をチェックし、設定されている場合は、ハンドラーを呼び出します。それ以外の場合は何もしません。
私の懸念は、電話についてDefWindowProcです。単に「デフォルトの動作を実行する」ように見えるかもしれませんが、実際にはいくつかの重要なことを実行することがあります。たとえば、WM_LBTNDOWN呼び出さないことで無効にDefWindowProcすると、[X] ボタンをクリックしてウィンドウを閉じることができなくなります。
一方で、電話したくない場合もありますDefWindowProc。たとえば、もしWM_CLOSE来たら、アプリケーションを閉じないことにするかもしれません。DefWindowProcこの場合、 を呼び出しますDestroyWindow。
私の質問は次のとおりです。に電話するDefWindowProc必要がありますか? もしそうなら、いつもですか、それとも時々ですか?