- 締切済み
VC++のダイアログでOpenGLの動画とボタン
OpenGLのグラフィクスをVC++のダイアログ上に表示させて,プログラムを作成しているのですが,OpenGLを動画にするとボタンが押せなくなってしまいます. ディスプレイの更新はOnPanit()を呼び出すことで,グラフィクスを常に更新させているのですが,この手法では,グラフィクスの更新中はボタン入力待ちになってないみたいです. グラフィクスを常に更新し続け,ボタン等のツールも利用できるようにしたいのですが,ご存知の方がいらっしゃいましたらご教授ください.
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- noocyte
- ベストアンサー率58% (171/291)
以前 OpenGL ES + VC で作ったプログラムの一部です.ご参考まで. インデントが潰れないようにするため,半角空白を全角空白に置換しています. (MFC を使っていなくてすいません.) // 大域変数 (メッセージループ制御用) ======================================= BOOL Wait = FALSE; // アニメーションを一時停止したい時に真にする. BOOL Done = FALSE; // アニメーションを終了したい時に真にする. // OpenGL を用いて実際に描画を行う関数 ===================================== void Render(int width, int height) { (中略) if(Step) { (アニメーション用データを更新する.ここでは描画は行わない. (例:少し図形の回転角を増やす,など.)) Step = FALSE; } (OpenGL を用いて実際に描画を行う.) } // メッセージループ ======================================================== MSG msg; HACCEL hAccelTable; while(!Done) { if(Wait) { // アニメーション停止中の場合:普通のメッセージループ if(!GetMessage(&msg, NULL, 0, 0)) break; goto ProcessMessage; } else { // アニメーション動作中の場合:メッセージがあるか? if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // ある場合:それを処理する. if(msg.message == WM_QUIT) break; ProcessMessage: if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else { // 再描画が行われるように「予約」する. InvalidateRect(AppWindow, NULL, FALSE); // 次の描画の際にアニメーションが少し動くようにする. Step = TRUE; } } } // ウインドウプロシージャの WM_PAINT 処理部 (OnPaint() 相当部分) =========== case WM_PAINT: { PAINTSTRUCT ps; RECT rect; HDC hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); EndPaint(hwnd, &ps); // 実際に再描画を行う. Render(rect.right, rect.bottom); } break;