vc2005/vc2008ならば、OpenGLアプリも、Win32ではなく.NETで作りたいところ。そんな時はOpenGLSimpleAdapterを利用するのが一番速くて簡単だと思うが、本日記はそのからくり(というほどでもないが)の説明にあたるのでよければ参考にして欲しい。
WindowsFormアプリケーションで、Panel インスタンスを用意する。
すると、Formのコンストラクタで、例えば以下のようなコードを呼び出すだけであっという間にそのPanelはOpenGLの画面となってしまうという事実。
ポイントとなるのは、青い行で、フォームの、HDC を取得できてしまうこと。あとはWin32の世界だから、HDCが取得できているときの、OpenGL画面召還コードを記述するのみだ。
void SetupRenderingContext( Panel^ parentForm ){
m_hDC = GetDC( (HWND)parentForm->Handle.ToPointer() );
if(!m_hDC)
return;
{
static PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
};
GLint iPixelFormat;
if( (iPixelFormat = ChoosePixelFormat(m_hDC, &pfd) ) == 0) return;
if(SetPixelFormat(m_hDC, iPixelFormat, &pfd) == FALSE) return;
}
if( (m_hglrc = wglCreateContext(m_hDC) ) == NULL) return; // pure Managed だとランタイムでエラーに
if( (wglMakeCurrent(m_hDC, m_hglrc) ) == NULL)
return;
else{
const GLsizei& in_width = parentForm->Width;
const GLsizei& in_height = parentForm->Height;
glViewport(0,0,in_width, in_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)in_width/(GLfloat)in_height,0.1f,100.0f);
//
wglMakeCurrent(0, 0);
}
//
this->m_scene = new pcScene;
return;
}//
ただし、プロジェクトの「全般」のところで、共通言語ラインタイムサポートオプションが、デフォルトでは、「clr:pure」となっているのを、ただの「clr」にしとかないと、wglCreateContextで、失敗するので、注意が必要だ。