VC++のダイアログベースアプリケーションの子ウインドウでOpenGL

23May2003 小坂敏文
Feb2011 VS2010用ワークスペース追加

1.はじめに
「WindowsPC+VC++」でOpenGLを学習する際に,glutを用いれば,ウインドウのオープンなどわずらわしいことをを自分で書かなくてもOpenGLが使えるメリットがあります。しかし,ダイアログベースアプリケーション内の子ウインドウにOpenGLで図形を描く環境がありません。そこで,MFC(Microsoft Foundation Class)を用いてダイアログベースアプリケーション内の子ウインドウにOpenGLで図形を描くテンプレートを作りましたので公開します。

ここに紹介するテンプレートは,MicrosoftVC++(Ver6.0)で作成していますが,
VisualStudio2008以前を利用している環境で動作できると思います。
またVisualStudio2010はかなり構造が変化してしまったようで,作りなおしています。こちらの方は「VS2010用」と書いておきました。
glutは使用していません。gluまで使用しています。

2.基本テンプレート
とにかくOpenGLで図を描いてみるテンプレートです。
VC++の新規作成で標準のMFC AppWizard(EXE)で作ってあります。
  DIALOGベースアプリを選んだ以外は標準のままです。
DIALOGリソースにピクチャを新規に作り,IDを付け(IDC_GLVIEW)と「通知」オプションONを行いました。
COpenGLクラスを作りました。
ClassWizardでオブジェクトCOpenGLに対して「WM_DESTROY」「PreSubclassWindow」のメッセージに対するメッセージハンドラを追加しました。
あとはファイル内にある関数をダウンロードファイルのように作りこみました。
拡張時の注意
  基本的にユーザ希望するの描画はCOpenGL::renderScene()中に記述する。
  Viewの設定はCOpenGL::PreSubclassWindow()の後半に記述する。

ワークスペースダウンロード DialogOpenGLtemplate3.lzh  (VS2010用 OpenGL_Dialog_test1.zip

実行の様子

3.タイマの実装

アニメーションにするには,一定時間間隔の描画が必要になる。このような場合にはタイマを使う。
タイマを使うには基本テンプレートに次のように追加する。
リソースのStringにタイマIDを加える(IDS_TIMER1)
ClassWizardでオブジェクトCOpenGLに対して「WM_TIMER」のメッセージに対するメッセージハンドラを追加しました。
COpenGL中PreSubclassWindowにタイマ起動命令を書いた。
  setTimer(IDS_TIMER1,20,NULL);
OnTimerハンドラでpaintWindow()を起動するようにした。
変数tickは現在が何回目の描画なのかをカウントする変数で,この変数をもとに動作を行なえばよい。
ダイアログにボタンをつけて,このボタンをクリックした時のメッセージハンドラ内にCOpenGL中のタイマ起動命令を書いてもよい。(m_pDisplay->setTimer(IDS_TIMER1,20,NULL);)

ワークスペースダウンロード DialogOpenGLtemplate4.lzh  (VS2010用 OpenGL_Dialog_test2.zip

 

4.マウス操作の取り込み

マウスの操作である動作を行なうようにできる。
このテンプレートではドラッグによる視点の回転を実現している。
このテンプレートは「3.タイマの実装」でのテンプレートに以下のことを追加している。
ClassWizardでオブジェクトCOpenGLに対して「WM_LBUTTONDOWN」「WM_LBUTTONUP」「WM_MOUSEMOVE」のメッセージに対するメッセージハンドラを追加しました。
これら3つのハンドラ関数中で取得できるマウス現在位置は描画ウインドウの左上を原点とした座標です。
座標軸は,右側に向けてxの+方向,下側に向けてyの+方向です。

ワークスペースダウンロード DialogOpenGLtemplate5.lzh   (VS2010用 OpenGL_Dialog_test3.zip

実行の様子


5.光の効果

OpenGLが備えている光の効果を導入した例です。
このプログラミングは純粋なOpenGLを学んで下さい。
いずれにしても,基本的にユーザ希望するの描画はCOpenGL::renderScene()中に記述することには変りありません。

ワークスペースダウンロード DialogOpenGLtemplate6.lzh  (VS2010用 OpenGL_Dialog_test4.zip

実行の様子

 

5.ポリキューブの定義用アプリ

(1)ポリキューブとは立方体が複数複合してできる立体です。
(2)赤格子の正方形の真ん中をクリックするとその位置に立方体が現れます。
   もう一度同じ場所をクリックすると消せます。
(3)グラフィックス部分をマウスドラッグすると画面を回転させます。
(4)「+」「−」ボタンでZ軸方向に生成されたポリキューブを移動させます。
(5)移動後にさらに立方体を追加し,好みのポリキューブを生成します。

ワークスペースダウンロード polycube0.lzh polycube1.lzh polycubemaker.lzh polycubeviewer.lzh polycube2.lzh polycube3.lzh

実行の様子
周りを廻っている赤い立方体は動作を確認するためのもので,目的とする作業とは無関係です

 

6.マルチGLウインドウのテンプレート

マルチGLウインドウのテンプレートの例です。

ワークスペースダウンロード  DialogOpenGLtemplate5multi.lzh

実行の様子

 

7.二次元図形のテンプレート

二次元図形のテンプレートの例です。

ワークスペースダウンロード  DialogOpenGLtemplate_2D.lzh

実行の様子