Win32 App Writing the Window Procedure - yoshimune/LearningDirectX11 GitHub Wiki
This page refers to 【Writing the Window Procedure】
DispatchMessage関数はターゲットウィンドウのウィンドウプロシージャを呼び出します。
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
4つの引数があります。
hwnd
はウィンドウのハンドルですuMsg
はメッセージコードです。例えば、WM_SIZEメッセージはウィンドウのリサイズを指示しますwParam
とlParam
はメッセージに関係する追加データを含みます。正確な意味はメッセージコードに依存します。
LRESULEはプログラムがWindowsに返すinteger値です。プログラムの特定のメッセージへのレスポンスを含みます。この値の意味はメッセージコードに依存します。CALLBACKは関数の呼び出し規約です。
典型的なウインドウプロシージャは単にメッセージコードを切り替える大きなswitch文です。取り扱うハンドルメッセージに応じたケースをそれぞれ追加してください。
switch (uMsg)
{
case WM_SIZE: // Handle window resizing
// etc
}
Default Message Handling
もしウィンドウプロシージャにメッセージに対応したハンドルがない場合、メッセージパラメータを直接DefWindowProc関数に渡します。この関数はメッセージに応じたデフォルトの動作を行います、
return DefWindowProc(hwnd, uMsg, wParam, lParam);
Avoiding Bottlenecks in Your Window Procedure
ウィンドウプロシージャが実行されたとき、ウィンドウズが同一のスレッドで作成した他のメッセージはブロックされます。したがって、ウィンドウプロシージャ内で長い処理を行うのは避けてください。例えば、プログラムがTCPコネクションをしたとすると、サーバーから応答があるまで待ち続けてしまいます。もしウィンドウプロシージャ内で動作した場合は、サーバーからの返答があるまでUIは返答しません。その間、ウィンドウはマウスやキーボードのインプットによって画面更新したり終了することもできません。
代わりに、Windowsに組み込まれているマルチタスキングの機能の一つを使用して、作業をを別のスレッドに移動すべきです。
- スレッドを作成する
- スレッドプールを使用する
- 非同期I/O呼び出しを使用する
- 非同期プロシージャコールを使用する