wGLContext(hDC)==FALSE)
return 0;
return 0;
}
----下 面 需 要 作 的 步 骤 就 是 建 立RC, 并 置 为 当 前RC。
----在 视 类 中 加 入 保 护 函 数 CreateViewGLContext(HDC hDC) 和 变 量HGLRC m_hGLContext:
BOOL COPView::CreateViewGLContext(HDC hDC)
{
m_hGLContext = wglCreateContext(hDC);
if (m_hGLContext == NULL)
{
return FALSE;
}
if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)
{
return FALSE;
}
return TRUE;
}
加 入 函 数OnDestroy 来 响 应WM_DESTROY:
void COPView::OnDestroy()
{
if(wglGetCurrentContext()!=NULL)
{
wglMakeCurrent(NULL, NULL) ;
}
if (m_hGLContext!=NULL)
{
wglDeleteContext(m_hGLContext);
m_hGLContext = NULL;
}
CView::OnDestroy();
}
----最 后, 编 辑 一 下COPView 类 构 造 函 数:
COPView::COPView()
{
m_hGLContext = NULL;
m_GLPixelIndex = 0;
}
----现 在, 我 们 就 可 以 进 行OpenGL 画 图 了, 虽 然 它 看 起 来 仍 然 像 一 个 典 型 的MFC 程 序。
----现 在 我 们 进 行 下 一 步 建 立 视 点 和 矩 阵 模 型, 用ClassWizard 在 视 类 中 加 入 函 数OnSize 响 应WM_SIZE。 如 下 所 示:
void COPView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
GLsizei width, height; GLdouble
aspect;
width = cx; height = cy;
if (cy==0)
aspect = (GLdouble)width;
else
aspect = (GLdouble)width/(GLdouble)height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, aspect, 1, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
加 入 函 数:void COPView::OnPaint()
{
CPaintDC dc(this); // device context for painting
COPDoc * pDoc = GetDocument();
pDoc ->RenderScene();
}
----在 文 档 类 中 加 入 公 共 函 数RenderScene():
void COPDoc::RenderScene(void)
{ glClear(GL_COLOR_BUFFER_BIT); glFlush(); }
----现 在 程 序 运 行 后 仅 是 黑 黑 的 屏 幕, 我 们 需 要 加 进 些 东 西。
----在 文 档 类 中 加 一 个 枚 举 变 量 GLDisplayListNames:
enum GLDisplayListNames { ArmPart1,ArmPart2 };
----为 将 来 建 立 显 示 列 表 用。 编 辑 函 数 OnNewDocument(), 编 码 如 下:
BOOL COPDoc::OnNewDocument()
if (!CDocument::OnNewDocument())
return FALSE;
glNewList(ArmPart1, GL_COMPILE);
GLfloat RedSurface = { 1.0f, 0.0f, 0.0f, 1.0f};
GLfloat GreenSurface = { 0.0f, 1.0f, 0.0f, 1.0f};
GLfloat BlueSurface = { 0.0f, 0.0f, 1.0f, 1.0f};
GLfloat LightAmbient = { 0.1f, 0.1f, 0.1f, 0.1f };
GLfloat LightDiffuse = { 0.7f, 0.7f, 0.7f, 0.7f };
GLfloat LightSpecular = { 0.0f, 0.0f, 0.0f, 0.1f };
GLfloat LightPosition = { 5.0f, 5.0f, 5.0f, 0.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
glEnable(GL_LIGHT0);
glMaterialfv(GL_FRONT_AND_BACK,
GL_AMBIENT, RedSurface);
glBegin(GL_POLYGON);
glNormal3d( 1.0, 0.0, 0.0);
glVertex3d( 1.0, 1.0, 1.0); glVertex3d(
1.0, -1.0, 1.0);
glVertex3d( 1.0, -1.0, -1.0); glVertex3d
( 1.0, 1.0, -1.0); // 画 第 一 个 面
glEnd();
glBegin(GL_POLYGON);
glNormal3d( -1.0, 0.0, 0.0);
// 此 处 同 上 画 第 二 个 面。
立 方 体 的 中 心 为 坐 标 原 点。