VC++の.NET Frameworkアプリケーションの子ウインドウでOpenGL
23Feb2011 coskx
1.はじめに
「WindowsPC+VC++」でOpenGLを学習する際
に,glutを用いれば,ウインドウのオープンなどわずらわしいことをを自分で書かなくてもOpenGLが使えるメリットがあります。しかし,Form
ベースアプリケーション内の子ウインドウにOpenGLで図形を描く環境がありません。そこで,Microsoft
.NET
Frameworkを用いてダイアログベースアプリケーション内の子ウインドウにOpenGLで図形を描くテンプレートを作りましたので公開します。
VisualStudio2010で作成しています。 .NET Framework 4.0
を使用しています。
glutは使用していません。gluまで使用しています。
2.基本テンプレート(タイマ割り込みによる描画付き)
とにかくOpenGLで図を描いてみるテンプレートです。Goボタンを押すと図形が回転します。
VisualStudioの新規作成でフォームアプリケーションから作ってあります。
Formリソースにピクチャボックスを新規に作り,IDを付け(IDC_GLVIEW)としました。
パネルを2重に作ってDockを使ってフォームのリサイズがあってもボタンが右下にとどまるようになっています。
(ピクチャボックスより先にパネル,ボタンを貼り付けるのがポイントで,ピクチャボックスはパネルには食い込みません。)
またTimerコントロールも貼りつけています。
次にCOpenGLクラスを作りました。
COpenGLクラス内に関数attach_GL()を作り,フォームからピクチャボックスをもらって,ここにOPenGLの図形を描くための初期化をしています。
タイマ割り込みはフォームに行われるので,フォームからCOpenGLにincreaseTick()で通知しています。
描画のタイミングは,フォームが出来た時(shown),ウインドウが別のウインドウの陰から出た時などで描画が必要になった時(paint),タイマ割り込みがあった時(tick)の3つです。
基本的にユーザ希望するの描画はCOpenGL::paintWindow,COpenGL::renderScene()中に記述する。
ワークスペースダウンロード OpenGLForm1.zip
実行の様子 |
3.マウス操作の取り込み
マウスの操作である動作を行なうようにできる。
このテンプレートではドラッグによる視点の回転を実現している。
このテンプレートは「2.基本テンプレート」に以下のことを追加している。
オブジェクトピクチャボックスに対して「MouseDown」「MouseUp」「MouseMove」のイベントに対するハンドラを追加しました。
これらのイベントハンドラはフォーム中に作られるので,これをOpenGLに通報しています。
これら3つのハンドラ関数中で取得できるマウス現在位置は描画ウインドウの左上を原点とした座標です。
座標軸は,右側に向けてxの+方向,下側に向けてyの+方向です。
画面中央をマウスドラッグを行うと,図形がぐりぐりと動きます。
ワークスペースダウンロード OpenGLForm2.zip
実行の様子 |
5.光の効果
OpenGLが備えている光の効果を導入した例です。
このプログラミングは純粋なOpenGLを学んで下さい。
いずれにしても,基本的にユーザ希望するの描画はCOpenGL::paintWindow,COpenGL::renderScene()中に記述することには変りありません。
ワークスペースダウンロード OpenGLForm3.zip
実行の様子 |