glVertex3f( 0.0f, 1.0f, 0.0f); // Top glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right glEnd(); // Finished Drawing The Triangle SwapBuffers(hrenderDC); } 下一步,就是初始化OpenGL了^_^, 为你的对话框添加WM_INITDIALOG消息:BOOL CRender::OnInitDialog() { CDialog::OnInitDialog(); CWnd *wnd=GetDlgItem(IDC_RENDER); hrenderDC=::GetDC(wnd->m_hWnd); if(SetWindowPixelFormat(hrenderDC)==FALSE) return 0;
if(CreateViewGLContext(hrenderDC)==FALSE) return 0; glPolygonMode(GL_FRONT,GL_FILL); glPolygonMode(GL_BACK,GL_FILL); /////////////////////////////////////////// glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glViewport(0,0,259,231); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,1,0.1,100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glShadeModel(GL_SMOOTH); // Enable Smooth Shading glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background glClearDepth(1.0f); // Depth Buffer Setup glEnable(GL_DEPTH_TEST); // Enables Depth Testing glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do ///////////////////////////////////////////////////////////////////////// glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); SetTimer(1,10,0);
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }接着添加WM_TIMERvoid CRender::OnTimer(UINT nIDEvent) { RenderScene(); m_yRotate += 1;
CDialog::OnTimer(nIDEvent); }别忘了初始化 CRender::CRender(CWnd* pParent /*=NULL*/) : CDialog(CRender::IDD, pParent) { PixelFormat=0; m_yRotate = 0; //{{AFX_DATA_INIT(CRender) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT }好了,运行一下看看,是不是看到一个旋转的白色三角形?写得我累死了,有什么不明白给我消息!
但为什么要在这里呢?
在picture control 里不行吗?
新建一个对话框,类名为CRender,ID为IDD_DIALOG2
新建一个picturn control;
设定其ID为IDC_RENDER(默认值为IDC_STATIC)
在Render.cpp头部加上:
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
同时,为你的工程加入库winmm.lib opengl32.lib glu32.lib glaux.lib在Render.h的public里加入:
BOOL SetWindowPixelFormat(HDC hDC);//设定象素格式
BOOL CreateViewGLContext(HDC hDC);
void RenderScene();
HDC hrenderDC;
HGLRC hrenderRC;
float m_yRotate;
int PixelFormat;这样,在Render.cpp里就可以添加以上定义的成员函数了:
BOOL CRender::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_TYPE_RGBA;pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 0;
pixelDesc.cStencilBits = 0;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
if(PixelFormat==0) // Choose default
{
PixelFormat = 1;
if(DescribePixelFormat(hDC,PixelFormat,
sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
{
return FALSE;
}
}if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE){
return FALSE;
}return TRUE;
}
BOOL CRender::CreateViewGLContext(HDC hDC)
{
hrenderRC = wglCreateContext(hDC);if(hrenderRC==NULL)
return FALSE;if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
return FALSE;return TRUE;
}void CRender::RenderScene()
{
/////////////////////////////////////////////////
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
// glRotated(m_xRotate, 1.0, 0.0, 0.0);
glRotated(m_yRotate, 0.0, 1.0, 0.0);
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle
SwapBuffers(hrenderDC);
}
下一步,就是初始化OpenGL了^_^,
为你的对话框添加WM_INITDIALOG消息:BOOL CRender::OnInitDialog()
{
CDialog::OnInitDialog(); CWnd *wnd=GetDlgItem(IDC_RENDER);
hrenderDC=::GetDC(wnd->m_hWnd);
if(SetWindowPixelFormat(hrenderDC)==FALSE)
return 0;
if(CreateViewGLContext(hrenderDC)==FALSE)
return 0;
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_FILL);
/////////////////////////////////////////// glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glViewport(0,0,259,231);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,1,0.1,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
/////////////////////////////////////////////////////////////////////////
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); SetTimer(1,10,0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}接着添加WM_TIMERvoid CRender::OnTimer(UINT nIDEvent)
{
RenderScene();
m_yRotate += 1;
CDialog::OnTimer(nIDEvent);
}别忘了初始化
CRender::CRender(CWnd* pParent /*=NULL*/)
: CDialog(CRender::IDD, pParent)
{
PixelFormat=0;
m_yRotate = 0;
//{{AFX_DATA_INIT(CRender)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}好了,运行一下看看,是不是看到一个旋转的白色三角形?写得我累死了,有什么不明白给我消息!