MFC Dialog 기반 openGL 설정 방법 및 설정 완료된 Project

2007. 9. 20. 16:25HW & SW

이 내용은 http://blog.naver.com/silzon 블로그의 내용을 기반으로 구성되었다.







=======================================================================================
glut.h     ::   program \ Microsoft Visual Studio \ VC98 \ include \ GL 폴더 속에 넣어준다.
Lib files  ::   program \ Microsoft Visual Studio \ VC98 \ Lib                폴더 속에 넣어준다.
Dll files   ::   Windows(WINNT) \ system                                               폴더 속에 넣어준다.
=======================================================================================

Step 1.
Dialog Base 기본 MFC를 구성.
(항상 초기 구성후 Build를 한번 해주어 Classview에서 Class가 사라지는 것을 방지)

Step 2.
CopenGLbaseDlg에 HGLRC 타입의 변수 m_hRC 와 HDC 타입의 변수 m_hDC 변수를 생성.

Step 3.
1) 컨트롤 + w 를 눌러 클래스 위자드를 실행 시킨다.
2) Project: openGLbase, Class name: COpenGLbaseDlg, Object IDs: COpenGLBaseDlg 를 확인 한다.
3) Messages 에서 WM_SIZE 를 더블클릭(반드시 더블클릭!) 후, Edit Code 버튼을 누른다.
4) 다음 코드를 작성한다.
void COpenGLbaseDlg::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
 VERIFY(wglMakeCurrent(m_hDC,m_hRC));

 GLResize(cx,cy);

 VERIFY(wglMakeCurrent(NULL,NULL)); 
}

Step 4.
1) GLResize() 함수 생성
2) 다음 코드를 작성한다.
void COpenGLbaseDlg::GLResize(int cx, int cy)
{
 GLfloat fAspect;

 if(cy==0) cy=1;

 glViewport(0,0,cx,cy);

 fAspect = (GLfloat)cx / (GLfloat)cy;

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 gluPerspective(60.0f, fAspect, 1.0f, 10000.0f);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
}


Step 5.
1) 컨트롤 + w 를 눌러 클래스 위자드를 실행 시킨다.
2) Project: openGLbase, Class name: COpenGLbaseDlg, Object IDs: COpenGLBaseDlg 를 확인 한다.
3) Messages 에서 WM_CREATE 를 더블클릭(반드시 더블클릭!) 후, Edit Code 버튼을 누른다.
4) 다음 코드를 작성한다.
int COpenGLbaseDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CDialog::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 // TODO: Add your specialized creation code here
 int nPixelFormat;
 m_hDC = ::GetDC(m_hWnd);

 static PIXELFORMATDESCRIPTOR pfd =
 {
  sizeof(PIXELFORMATDESCRIPTOR),
   1,
   PFD_DRAW_TO_WINDOW|
   PFD_SUPPORT_OPENGL|
   PFD_DOUBLEBUFFER,
   PFD_TYPE_RGBA,
   24,
   0,0,0,0,0,0,
   0,0,
   0,0,0,0,0,
   32,
   0,
   0,
   PFD_MAIN_PLANE,
   0,
   0,0,0
 };
 nPixelFormat = ChoosePixelFormat(m_hDC, &pfd);
 VERIFY(SetPixelFormat(m_hDC,nPixelFormat, &pfd));
 m_hRC = wglCreateContext(m_hDC);
 VERIFY(wglMakeCurrent(m_hDC,m_hRC));
 wglMakeCurrent(NULL,NULL);
 
 return 0;
}

Step 6.
1) 컨트롤 + w 를 눌러 클래스 위자드를 실행 시킨다.
2) Project: openGLbase, Class name: COpenGLbaseDlg, Object IDs: COpenGLBaseDlg 를 확인 한다.
3) Messages 에서 WM_DESTROY 를 더블클릭(반드시 더블클릭!) 후, Edit Code 버튼을 누른다.
4) 다음 코드를 작성한다.
void COpenGLbaseDlg::OnDestroy()
{
 wglDeleteContext(m_hRC);
 ::ReleaseDC(m_hWnd, m_hDC);

 
 CDialog::OnDestroy();
 
 // TODO: Add your message handler code here
 
}

Step 7.
1) Settings For 에서 Win32 Debug 를 확인한다.
   ( 만약 Release 모드에서 개발한다면, Win32 Release 로 바꾼다 )
2) Link 탭 클릭
3) Object/librry modules 를 다음과 같이 써준다.  - opengl32.lib glu32.lib glut32.lib glaux.lib
   ( 반드시, MFC 와 자신의 컴퓨터에 OpenGL 이 셋팅이 되어 있어야 된다. )
4) OK 버튼 클릭!

Step 8.
1) 왼쪽 하단의 File view 탭 클릭
2) Header Files 폴더 속에 있는 StdAfx.h 더블 클릭!
3) 다음을 입력
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <gl/glaux.h>


Step 9.
1) GLRenderScene() 함수 생성
2) 다음 코드를 작성한다.
void COpenGLbaseDlg::GLRenderScene()
{
 glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

 glColor3f(1.0f, 0.0f, 0.0f);

 glPushMatrix();

 glEnable(GL_DEPTH_TEST);
 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

 glShadeModel(GL_FLAT);
 glLoadIdentity();

 gluLookAt(0.0f, 0.0f, 1000.0f, 0.0f, 10.0f, 0.0f, 0.0f, 1.0f, 0.0f);

 //To draw meshes of object of something you want, Just code here
 ////////////////////////////////////////////////////////////////
 glBegin(GL_TRIANGLES);
 glVertex3f(-100,0,0);
 glVertex3f(0,100,0);
 glVertex3f(100,0,0);
 glEnd();
 ////////////////////////////////////////////////////////////////
 glPopMatrix();

 glFlush();
}

Step 10.
1) onPaint함수 수정
2) 다음 코드를 작성한다.
void COpenGLbaseDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();

  wglMakeCurrent(m_hDC, m_hRC);
  GLRenderScene();
  SwapBuffers(m_hDC);
  wglMakeCurrent(m_hDC,NULL);

 }
}

=======================================================================================
*SDI기반과 MDI기반에서도 설정 방법은 유사하다.

Step 1.
Library 추가

Step 2.
StdAfx.h에 헤더파일 추가

Step 3.
view클래스에 멤버 전역 변수 두개 추가 (m_hDC, m_hRC)

Step 4.
WM_SIZE 메시지 함수 추가

Step 5.
GLResize 함수 생성

Step 6.
WM_SIZE 메시지 함수인 onCreate 추가

Step 7.
onDraw함수에 내용 추가
(Dialog 베이스에서 onPaint함수에 적용된 내용 추가)

Step 8.
GLRenderScene 함수 생성
void CtestDlg::GLRenderScene()
{
 glLoadIdentity(); //행렬을 초기화

 glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //현재 버퍼를 비워줌

 glColor3f(1.0f, 0.0f, 0.0f); //버텍스의 색깔을 흰색으로 셋팅

 glPushMatrix();

 glEnable(GL_DEPTH_TEST); //깊이 테스트 On
 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

 gluLookAt(0.0f, 0.0f, 1000.0f, 0.0f, 10.0f, 0.0f, 0.0f, 1.0f, 0.0f); //카메라 설정
 //카메라의 위치는 (0,0,1000)에 있으며, 카메라가 바라보는 곳은(0,10,0)이다.
 //카메라의 Up Vector는 (0,1,0)이다.

 //To draw meshes of object of something you want, Just code here
 ////////////////////////////////////////////////////////////////
 glBegin(GL_QUADS);
 glVertex3f(-50,-50,0);
 glVertex3f(50,-50,0);
 glVertex3f(50,50,0);
 glVertex3f(-50,50,0);
 glEnd();
 ////////////////////////////////////////////////////////////////

 glFlush();
}

Step 9.
WM_DESTROY 메시지 함수인 onDestroy 추가



 

'HW & SW' 카테고리의 다른 글

LPSTR, LPCSTR, LPTSTR, LPCTSTR  (0) 2007.09.20
멀티미디어 타이머  (0) 2007.09.20
Intel JPEG Library 1.51  (0) 2007.09.19
Intel JPEG Library 1.1  (0) 2007.09.19
센서의 출력이 전류일 경우 전압으로 측정하기  (0) 2007.09.18