ウィンドウを表示するにはメッセージ ポンプを実行する必要があるため、そのポンプを使用してキーボードとマウスの入力を処理することもできます。キーボードイベントを子ウィンドウに渡すかどうかは、完全にポンプ次第です。必要に応じて、ポンプでそれらを処理できます。
典型的なメッセージ ポンプは次のようになります。
while (GetMessage(&msg, NULL, 0, 0))
{
if (WM_QUIT == msg.message)
break;
TranslateMessage(&msg); // post a WM_CHAR message if this is a WM_KEYDOWN
DispatchMessage(&msg); // this sends messages to the msg.hwnd
}
ゲームの場合、ポンプは次のようになります
while (true)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE | PM_NOYIELD))
{
bool fHandled = false;
if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
fHandled = MyHandleMouseEvent(&msg);
else if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
fHandled = MyHandleKeyEvent(&msg);
else if (WM_QUIT == msg.message)
break;
if ( ! fHandled)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
// if there are no more messages to handle right now, do some
// game slice processing.
//
}
}
もちろん、実際のポンプはそれよりもさらに複雑になる可能性がMsgWaitForMultipleObjects
あり、処理するメッセージがない場合でも定期的に目を覚ますことができますが、メッセージがある場合はすぐに目を覚ますことができます。