• 締切済み

VC++のダイアログでOpenGLの動画とボタン

OpenGLのグラフィクスをVC++のダイアログ上に表示させて,プログラムを作成しているのですが,OpenGLを動画にするとボタンが押せなくなってしまいます. ディスプレイの更新はOnPanit()を呼び出すことで,グラフィクスを常に更新させているのですが,この手法では,グラフィクスの更新中はボタン入力待ちになってないみたいです. グラフィクスを常に更新し続け,ボタン等のツールも利用できるようにしたいのですが,ご存知の方がいらっしゃいましたらご教授ください.

みんなの回答

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

以前 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;

関連するQ&A