#include <afxwin.h>
#include "OpenGLglut.h"
#include "glut.h"
class
DocBoxy :
public
CDocument {
public
:
CClientDC *m_pDC;
HGLRC hrc;
DECLARE_DYNCREATE(DocBoxy)
};
IMPLEMENT_DYNCREATE(DocBoxy, CDocument)
class
FrameBoxy :
public
CFrameWnd {
public
:
afx_msg
void
OnExit() {
if
(MessageBox( TEXT(
"Are you sure you want to close this window?"
), TEXT(
"DocViewBoxy"
), MB_OKCANCEL | MB_ICONQUESTION ) == 1 ) {
DestroyWindow();
}
}
afx_msg
void
OnAbout() {
MessageBox( TEXT(
"DocViewBoxy Version 1.0\nCopyright (C) 2013, By QQBoxy Huang.\nEmail: gs1458@gmail.com"
), TEXT(
"About"
), MB_OK );
}
DECLARE_DYNCREATE(FrameBoxy)
DECLARE_MESSAGE_MAP()
};
IMPLEMENT_DYNCREATE(FrameBoxy, CFrameWnd)
BEGIN_MESSAGE_MAP(FrameBoxy, CFrameWnd)
ON_COMMAND(ID_FILE_EXIT, OnExit)
ON_COMMAND(ID_HELP_ABOUT, OnAbout)
END_MESSAGE_MAP()
class
ViewBoxy :
public
CView {
public
:
void
OnDraw(CDC * aDC) {
DocBoxy *doc = (DocBoxy *)GetDocument();
ASSERT_VALID(doc);
glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, -7.0f);
glRotatef(-35.0f, 1.0f, 0.0f, 0.0f);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glNormal3f(-0.8944272f, 0.4472136f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glNormal3f(0.8944272f, 0.4472136f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glNormal3f(0.0f, 0.4472136f, -0.8944272f);
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glNormal3f(0.0f, 0.4472136f, 0.8944272f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
glFinish();
SwapBuffers( doc->m_pDC->GetSafeHdc() );
}
BOOL
PreCreateWindow(CREATESTRUCT& cs) {
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
return
CView::PreCreateWindow(cs);
}
BOOL
OnEraseBkgnd(CDC* pDC) {
return
true
;
}
void
OnDestroy() {
DocBoxy *doc = (DocBoxy *)GetDocument();
HGLRC hRC;
hRC= wglGetCurrentContext();
wglMakeCurrent(NULL, NULL);
if
(doc->hrc)
wglDeleteContext(hRC);
if
(doc->m_pDC)
delete
doc->m_pDC;
CView::OnDestroy();
}
bool
bSetupPixelFormat() {
DocBoxy *doc = (DocBoxy *)GetDocument();
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
};
int
pixelformat;
if
( (pixelformat = ChoosePixelFormat(doc->m_pDC->GetSafeHdc(), &pfd)) == 0 ) {
MessageBox(_TEXT(
"ChoosePixelFormat failed"
));
return
false
;
}
if
(SetPixelFormat(doc->m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) {
MessageBox(_TEXT(
"SetPixelFormat failed"
));
return
false
;
}
return
true
;
}
void
init() {
DocBoxy *doc = (DocBoxy *)GetDocument();
PIXELFORMATDESCRIPTOR pfd;
int
n;
doc->m_pDC =
new
CClientDC(
this
);
ASSERT(doc->m_pDC != NULL);
if
(!bSetupPixelFormat())
return
;
n = GetPixelFormat(doc->m_pDC->GetSafeHdc());
DescribePixelFormat(doc->m_pDC->GetSafeHdc(), n,
sizeof
(pfd), &pfd);
doc->hrc = wglCreateContext(doc->m_pDC->GetSafeHdc());
wglMakeCurrent(doc->m_pDC->GetSafeHdc(), doc->hrc);
glDepthFunc(GL_GREATER);
glEnable(GL_DEPTH_TEST);
glClearDepth(-2.0f);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
void
setLight() {
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 1.0f, 0.0f, 0.0f, 0.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
}
int
OnCreate(LPCREATESTRUCT lpCreateStruct) {
if
(CView::OnCreate(lpCreateStruct) == -1)
return
-1;
init();
setLight();
return
0;
}
void
OnSize(
UINT
nType,
int
cx,
int
cy) {
CView::OnSize(nType, cx, cy);
GLfloat nRange=20.f;
if
(cy == 0)
{ cy = 1; }
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if
(cx <= cy) {
glOrtho(-nRange, nRange, -nRange*cy/cx, nRange*cy/cx, -nRange, nRange);
}
else
{
glOrtho(-nRange*cx/cy, nRange*cx/cy, -nRange, nRange, -nRange, nRange);
}
glMatrixMode(GL_MODELVIEW);
glViewport(0, 0, cx, cy);
}
DECLARE_DYNCREATE(ViewBoxy)
DECLARE_MESSAGE_MAP()
};
IMPLEMENT_DYNCREATE(ViewBoxy, CView)
BEGIN_MESSAGE_MAP(ViewBoxy, CView)
ON_WM_DESTROY()
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
class
AppBoxy :
public
CWinApp {
public
:
BOOL
InitInstance() {
CDocument *doc;
CSingleDocTemplate* DocTemplate;
DocTemplate =
new
CSingleDocTemplate(
IDR_MENU,
RUNTIME_CLASS(DocBoxy),
RUNTIME_CLASS(FrameBoxy),
RUNTIME_CLASS(ViewBoxy)
);
AddDocTemplate(DocTemplate);
doc = DocTemplate->CreateNewDocument();
m_pMainWnd = DocTemplate->CreateNewFrame( doc, NULL );
DocTemplate->InitialUpdateFrame ( (CFrameWnd*)m_pMainWnd, doc );
m_pMainWnd->ShowWindow(SW_SHOW);
return
true
;
}
};
AppBoxy appboxy;