WindowsForm でOpenGL

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で、失敗するので、注意が必要だ。