OpenGLを使ってみる。その4.2 -描画スレッドの停止条件を追加(WM_ENABLE)-

前回OpenGLを使ってみる。その4.1 -描画スレッドの停止と再開について- - while( c++ );のサンプルでバグがあったので修正します。

1.メニュー→ヘルプ→バージョン情報でモーダルダイアログを表示すると、ウィンドウが無効状態でも描画スレッドが実行されてしまう

解決策
  • WM_ENABLEでスレッドの停止、再開
ウィンドウのサイズ変更、移動時 WM_ENTERSIZEMOVE、WM_EXITSIZEMOVE
メニュー選択時 WM_ENTERMENULOOP、WM_EXITMENULOOP
タイトルバーダブルクリック時 WM_NCLBUTTONDBLCLK、wParam == HTCAPTION
システムメニュー(最小化、最大化、タスクバーのアイコンクリック) WM_SYSCOMMAND、( wParam & 0xFFF0 ) == SC_MAXIMIZE、SC_MINIMIZE、SC_RESTORE
ウィンドウの非アクティブ時 WM_ACTIVATEAPP
ウィンドウ上にモーダルダイアログを出した時 WM_ENABLE
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    /*...*/

        //ウィンドウ上にモーダルダイアログを出した場合など、
        //ウィンドウが無効化した時にスレッド停止、有効化で再開
    case WM_ENABLE:
        if( wParam )
        {
            t.start();
        }
        else
        {
            t.stop();
        }
        break;

    /*...*/
}

2.OpenGL初期化時にReleaseDCを忘れていた

解決策
  • ReleaseDCを追加
  • MFCのようにDCクラスを作るべきか(いわゆるRAII)
bool GraphicsDevice::Init( HWND hwnd )
{
    HDC dc = GetDC( hwnd );
    
    /*...*/
    
    ReleaseDC( hwnd, dc );//追加

    return true;
}

気になった点

ネット上のOpenGLのサンプルは、レンダリングコンテキスト生成時のデバイスコンテキストを、プログラム終了時まで保持しているものが多いですよね?
アレって大丈夫なのでしょうか??

何か気持ちが悪いので、使い終わったらすぐReleaseDCを呼び出しています。