2.トラックOpenGLビュークラスを作る



トラッキング(マウス操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLビュークラスを、ベースOpenGLビュークラスの派生クラスとして作成します。

実行形式ファイルダウンロード (TrackOpenGL_exe.lzh)

ソースファイルダウンロード (TrackOpenGL_src.lzh)

プロジェクトの作成

プロジェクトの種類:MFC AppWizard (exe)
プロジェクト名:TrackOpenGL
位置:適当なフォルダを指定
それ以外:デフォルト設定のまま
でプロジェクトを作成します(OKボタンを押します)。

作成するアプリケーションの種類:SDI
それ以外:デフォルト設定のまま
で次へボタンを押します。

設定を変更せず次へボタンを押します。

設定を変更せず次へボタンを押します。

印刷および印刷プレビュー:チェックを外します
それ以外:デフォルト設定のまま
で次へボタンを押します。

設定を変更せず次へボタンを押します。

設定を変更せず終了ボタンを押します。

OKボタンを押します。

ビルドし、エラー、警告がないことを確認します。

ベースOpenGLビュークラスファイルをプロジェクトに追加

「1.ベースOpenGLビュークラスを作る」で作成した
BaseOpenGLView.cpp
BaseOpenGLView.h
をTrackOpenGLプロジェクトフォルダにコピーします。

プロジェクトに
BaseOpenGLView.cpp
BaseOpenGLView.h
を追加します。


BaseOpenGLView.cppの
#include "BaseOpenGL.h"
#include "BaseOpenDoc.h"
をコメントアウトします。



BaseOpenGLView.cppおよびBaseOpenGLView.hの
CBaseOpenGLDocをCDocumentに置換します。(「単語単位で探す」「大文字と小文字を区別する」にチェックを入れます。)


ビルドし、エラー、警告がないことを確認します。

トラックOpenGLビュークラスの親クラスの変更

TrackOpenGLView.hに
#include "BaseOpenGLView.h"
を追加します。



TrackOpenGLView.cppおよびTrackOpenGLView.hの
CViewをCBaseOpenGLViewに置換します。(「単語単位で探す」「大文字と小文字を区別する」にチェックを入れます。)


ビルドし、エラー、警告がないことを確認します。

トラックOpenGLビュークラスのOnDraw()の削除

ベースOpenGLビュークラスのOnDraw()が呼ばれるように、トラックOpenGLビュークラスのOnDraw()を削除します。
ClassViewにてCTrackOpenGLViewのOnDraw(CDC *pDC)を右クリック、削除を選択します。



ビルドし、エラー、警告がないことを確認します。

実行し、BaseOpenGLプログラムと同じ結果になることを確認します。

メンバ変数、メンバ関数の宣言の追加

TrackOpenGLView.h のトラックOpenGLビュークラス宣言の前に
列挙型ETRACKINGMODEの定義
を追加します。
TrackOpenGLView.h のトラックOpenGLビュークラス宣言の最後にメンバ変数、メンバ関数の宣言を追加します。



ビルドし、エラー、警告がないことを確認します。

メンバ変数の初期化

トラックOpenGLビュークラスのコンストラクタにメンバ変数の初期化を追加します。



ビルドし、エラー、警告がないことを確認します。

マウス操作イベントハンドラの追加、編集

以下のマウス操作メッセージハンドラをトラックOpenGLビュークラスに追加します。

ウィンドウメッセージ名 メッセージハンドラ名
WM_LBUTTONDOWN OnLButtonDown
WM_LBUTTONUP OnLButtonUp
WM_MBUTTONDOWN OnMButtonDown
WM_MBUTTONUP OnMButtonUp
WM_MOUSEMOVE OnMouseMove
WM_MOUSEWHEEL OnMouseWheel

WM_MBUTTONDOWNおよびWM_MBUTTONUPはClassWizardのウィンドウメッセージ一覧に出てこないので、WM_RBUTTONDOWNおよびWM_RBUTTONUPでメッセージハンドラを追加後に、TrackOpenGLView.cpp および TrackOpenGLView.h のRBUTTONをMBUTTONに、RButtonをMButtonに置換します。(「大文字と小文字を区別する」にチェックを入れます。)





それぞれのメッセージハンドラにメンバ関数の呼び出しを追加します。



ビルドし、エラーが4件(「外部シンボルが未解決」3件、「外部参照が未解決」1件)あり、警告がないことを確認します。

BeginTracking()の追加、編集

マウス操作の開始処理に関するメンバ関数の定義を追加します。



TrackOpenGLView.cpp に
math.h のインクルードと
M_PI の定義
を追加します。



ベースOpenGLビューのメンバ変数
m_cx
m_cy
をprotected変数とします。



ビルドし、エラーが3件(「外部シンボルが未解決」2件、「外部参照が未解決」1件)あり、警告がないことを確認します。

EndTracking()の追加、編集

マウス操作の終了処理に関するメンバ関数の定義を追加します。



ビルドし、エラーが2件(「外部シンボルが未解決」1件、「外部参照が未解決」1件)あり、警告がないことを確認します。

DoTracking()の追加、編集

マウス操作のマウス移動中の処理に関するメンバ関数の定義を追加します。



ベースOpenGLビュークラスのメンバ関数
SetupViewingTransform
SetupViewingFrustum
をprotected関数、さらにvirtual関数とします。



ビルドし、エラー、警告がないことを確認します。

実行

マウス左ボタンドラックで描画空間が回転すること
マウス中ボタンドラッグで描画空間が平行移動すること
マウスホイールで描画空間が拡大縮小すること
を確認します。

実行結果