본문 바로가기

old drawer/OpenGL

[OpenGL] MFC 다이얼로그 기반에서 OpenGL 셋팅하기

<출처 : http://blog.naver.com/silzon?Redirect=Log&logNo=30021587464>

안녕하세요 ^^

오랜만에 OpenGL 강좌를 올리네요.

그동안 저한테 많은 일들이 일어났네요.

학교 근처 2년 반동안 지냈던 자취방을 떠나, 회사 근처로 이사도 하고, 간지 나는 노트북도 샀네요 ^^

주저리 주저리~

 

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

MFC Dlg (다이알로그) 기반에 OpenGL 셋팅 하기

 

OpenGL 을 이용하여, 빨간 사격형을 띄어 보도록 하자 !

 

 

 

완성 프로그램 : http://blog.naver.com/silzon/30021589980 위 링크에서 파일을 다운 받길 바란다.

 

 

 

많은 부분이 http://blog.naver.com/silzon/30018236413 이 내용과 겹칩니다.

 

다만, 차이점은 http://blog.naver.com/silzon/30018236413  여기서는 싱글 도규먼트 기반이었고,

 

이 강좌는 다이알로그 기반으로 셋팅을 하겠습니다.

 

마찬가지로 MFC, 또는 자신의 컴퓨터에 OpenGL 이 셋팅이 안되어 있다면,

 

http://blog.naver.com/silzon/30016391858 다음 링크를 참조 하기 바란다.

 

그리고, 이 MFC 에서 OpenGL 의 셋팅 방법에 정석 이란 없다.

 

분명 내 코드에서도, 불필요한 코드가 있을 것이고, 비효율적인 코드도 있을 수도 있다.

 

이 점을 참고 하여, 봐주길 바란다.

 

또한, 셋팅이 다 된 프로그램을 압축해서 올렸다.

 

다음부터, MFC 를 이용하여 OpenGL 프로그래밍을 할때는, 아래와 같이 일일이 셋팅을 해주지 말고,

 

압축해논 것을 복사 한 후, 압축을 풀어서 하면 수고를 덜 수 있다.

 

하지만, 명심 해야 할 것은, 처음 OpenGL 다루는 것이라면, 어느정도 셋팅 하는 것에 익숙해져야 할 것이다.

 

 

::::    1    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

Microsoft Visual C++ 을 실행 시킨 후,

1) MFC Wizard(exe) 를 클릭

2) Project name 입력

3) Location 설정 ( Location 은 까먹지 말도록 하자 )

4) OK 버튼 클릭

 

 

 

 

::::    2    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) Dialog based 체크

2) 나머진 안 건드려도 되므로, Finish 클릭

 

 

 

 

 

::::    3    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

다음과 같은 창이 뜰 것이다.

1) 왼쪽 하단에 Class View 탭을 클릭 한다

2) PrivilegeDlg classes + 를 클릭하여 트리를 열어 준다.

3) CPrivilegeDlgDlg + 를 클릭하여 트리를 열어 준다.

4) OnPaint() 함수가 보인다.

 

OnPaint() 함수가 일반 싱글 도큐먼트에서 OnDraw() 함수와 비슷 하다.

(사실 OnDraw() 함수는 OnPaint() 의 일부이다. )

 

 

 

 

 

::::    4    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) OnPaint() 함수를 더블클릭!

2) 그럼 OnPaint() 함수 내용이 보인다.

 

우리가 주로 코딩 해줄 부분은  else 부분이다.

 

 

 

 

::::    5    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

자, 이제부터 기본적인 OpenGL 셋팅에 들어간다.

 

일반 싱글 도큐먼트에서 OpenGL 셋팅 했던 방법과 매우 동일 하다. ( 참조 : http://blog.naver.com/silzon/30018236413 )

 

HGLRC 타입의 변수 m_hRC 와 HDC 타입의 변수 m_hDC 변수를 생성할 것이다.

 

1) CPrivilegeDlgDlg 에 마우스 올려 놓고, 마우스 오른쪽 클릭!

2) Add Member Variable... 클릭!

 

 

 

 

::::    6    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

다음과 같이 적어 주고, OK 버튼을 클릭 한다.

 

 

마찬가지로

 

HDC 타입의 변수 m_hDC 변수도 만들어 준다.

 

 

 

 

::::    7    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

 다음과 같이 두 전역 변수가 생겼는지 확인한다.

 

 

 

 

 

::::    8    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

 OnSize() 함수를 만들자.

 

1) 컨트롤 + w 를 눌러 클래스 위자드를 실행 시킨다.

2) Project, Class name, Object IDs 를 확인 한다.

3) Messages 에서 WM_SIZE 를 더블클릭(반드시 더블클릭!) 후, Edit Code 버튼을 누른다.

 

 

 

 

 

 

::::    9    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

 OnSize() 함수 안을 다음과 같은 내용으로 코딩을 한다.

 

 

 

허걱! GLResize() 함수가 없다!

 

::::   10    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

GLResize() 함수를 만들자!

 

1) CPriviegeDlgDlg 마우스 오른쪽 버튼을 클릭 한 후

2) Add Member Function... 클릭!

 

 

 

 

 

::::   11    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

다음과 같이 입력 후, OK 버튼을 클릭 한다!

 

 

 

 

 

 

 

::::   12    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

void 타입의 GLResize() 함수가 생성 되었다.

GLResize() 함수 내부의 내용은 다음과 같이 코딩을 해준다.

 

 

 

 

::::   13    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

음~ 이제 뭘 할까..??

 

OnCreate() 함수를 만들자!

 

1) 컨트롤 + w 를 눌러 컨트롤 위자드를 실행 시킨다.

2) 마찬가지로, Project 등을 확인 한 후, Messages 에서 WM_CREATE 를 더블 클릭!

3) Edit code 버튼 클릭!

 

 

 

 

::::   14    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

OnCreate() 함수의 내용을 다음과 같이 입력 한다.

 

 

 

 

 

 

::::   15    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

에휴... OpenGL 처음 셋팅하는게 가장 짜증이 납니다 ^^;;;

 

자, OnDestroy() 함수를 만듭시다!

 

1) 컨트롤 + w 를 눌러 클래스 위자드를 실행 시킵니다.

2) 마찬가지로, Project 등을 확인 한후, Messeages 에서 WM_DESTROY 를 더블 클릭후! Edit Code 를 클릭 합니다.

 

 

 

 

 

::::   16    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

OnDestroy() 함수를 다음과 같은 내용으로 입력 합니다.

 

 

 

 

 

::::   17    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

 

아!!!! 제일 처음에 헤더파일 추가 하는것을 안 했다...

 

현재까지 F7 이나 F5 를 누르면 엄청난 11개의 오류를 토해 낼 것이다.

 

미안한 일이지만, 이 시점에서 프로젝트 셋팅과 헤더 파일을 추가 하도록 하자 ^^

 

순서만 바뀐것이지, 아무 문제는 없다! (안심하도록... -_-;;)

 

1) 메뉴 -> Project -> Settings... 클릭!

 

 

 

 

 

 

::::   18    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

 

1) Settings For 에서 Win32 Debug 를 확인한다. ( 만약 Release 모드에서 개발한다면, Win32 Release 로 바꾼다 )

2) Link 탭 클릭

3) Object/librry modules 를 다음과 같이 써준다. ( 반드시, MFC 와 자신의 컴퓨터에 OpenGL 이 셋팅이 되어 있어야 된다. )

4) OK 버튼 클릭!

 

 

 

 

 

::::   19    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) 왼쪽 하단의 File view 탭 클릭

2) Header Files 폴더 속에 있는 StdAfx.h 더블 클릭!

3) 빨간 박스에 있는 내용 입력! ( 예, #include <gl/gl.h> )

 

 

이제 F7 이나 F5 누르면 에러가 안 날것이다.

 

 

 

::::   20    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

///;; 없네;; 원래 없는 거임;;

::::   21    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) Class View 탭에서 CPrivilegeDlgDlg 마우스 오른쪽 버튼 클릭

2) Add Member Function... 클릭!

 

 

 

 

 

::::   22    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) Type 과 선언을 다음과 같이 입력 후 OK 버튼 클릭!

 

 

 

 

 

::::   23    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) GLRenderScene() 함수를 다음과 같이 입력 해준다.

 

 

 

 

 

 

::::   24    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

자!!! 이제 F5 를 눌러서 실행 시켜 보도록 하자!!!!!

 

 

 

 

아무것도 안 뜬다. ㅋㅋ

 

OnPaint() 함수를 살짝 수정 하도록 하자!

 

1) OnPaint() 함수 더블 클릭!

2) else 아래 부분에 빨간 박스 안에 있는 내용을 입력 한다!

3) 자! 이제 진짜로 F5 눌러 보자!

 

 

 

 

::::   25    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

아.......................

 

TODO : 대화 상자 컨트롤을 여기에 두십시오.....  이건 뭘까...

 

지워 보도록 하자 -_-;;

 

 

 

 

 

::::   26    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

1) 오른쪽 하단의 Resource View 탭 클릭

2) IDD_PRIVILEGEDLG_DIALOG 더블 클릭

 

하면 다음과 같은 그림이 나온다.

 

여기서, TODO:대화 상자 컨트롤을 여기에 두십시오. 라는 문장 근처에 마우스 왼쪽 클릭 하면 선택이 되어 진다.

 

선택 한 후, delete 키 누르면 싹 지워진다.!

 

 

 

 

 

 

::: 결과 및 마치면서  ::::::::::::::::::::::::::::::::::::::::::::::::

 

 

 

 

Dlg 기반이라고 해서 싱글 도큐먼트 기반과 별 다른 점이 없다는 것을 여러분을 알 수 있을 것이다.

 

더욱 더 알찬 강좌 내용으로 여러분을 뵙도록 하겠다!