2

私はopenGLを含むwin32c/cppプロジェクトに取り組んでいます。私は始めたばかりで、標準のwin32プログラムがどのように機能するかについていくつかの基本的な質問がありました。チュートリアルに従って、winmainに新しいウィンドウを作成させ、ウィンドウのopenGLを有効にしてから、メインループに入ります。メッセージがある場合はプログラムがメッセージを処理し、そうでない場合はプログラムがopenGLアニメーションの描画に進みます。その後、openGLをシャットダウンしてウィンドウを破棄します。私はここで何が起こっているかについてあまり混乱していませんが、これは私が迷子になる場所です:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {


switch (message)
{

case WM_CREATE:
    return 0;

case WM_CLOSE:
    PostQuitMessage( 0 );
    return 0;

case WM_DESTROY:
    return 0;

case WM_KEYDOWN:
    switch ( wParam )
    {

    case VK_ESCAPE:
        PostQuitMessage(0);
        return 0;

    }
    return 0;

default:
    return DefWindowProc( hWnd, message, wParam, lParam );

}

私はwinmainで、この関数を次の方法でウィンドウクラスに登録していることを確認しています。

wc.lpfnWndProc = WndProc;

このプロセスはどの程度正確に機能しますか?誰かがパイプラインを私に説明できますか?winmainメソッドが実行されると、openglアニメーションの描画に進みますが、キーが押されるとすぐにメッセージ処理に入ります...そして何ですか?私のwinmainメソッドはWndProcメソッドとどのように通信しますか?マシンの観点から実際に何が起こっているのでしょうか?

4

1 に答える 1

0

WinMain にはTranslateMessage/DispatchMessage呼び出しのペアが必要です。TranslateMessage はキーストロークが正しく配信されるようにする責任があり、DispatchMessage はウィンドウ階層をトラバースして、入力フォーカスを持つウィンドウにメッセージを配信し、パラメーターとしてメッセージを使用して、ポインターが既定のウィンドウ メッセージ ハンドラー (ウィンドウ プロシージャ) として登録された関数を効果的に呼び出します。 .

于 2012-05-13T11:13:25.393 に答える