私は現在、純粋な 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
必要がありますか? もしそうなら、いつもですか、それとも時々ですか?