上传上代码大神们给看看吧。
先是.cpp文件View1::View1()
{
m_pDC = NULL;
m_hRC = NULL;
m_nLines = 50;   //背景网格线数
m_glfGridUnit = 10;   //网格尺寸
m_distance = 500.0;  //距离
       m_rotateX = PI * 0.5; //航向角,pi*0.5
m_rotateY = PI * 0.4; //俯仰角,pi*0.4
//设置视点
m_glfViewPosX = m_distance * sin(m_rotateY) * cos(m_rotateX);  
m_glfViewPosZ = m_distance * sin(m_rotateY) * sin(m_rotateX);
m_glfViewPosY = m_distance * cos(m_rotateY);
}
void View1::OnPaint()
{
CPaintDC dc(this); 
Init();
CRect rectCtrl;
GetClientRect(rectCtrl);
SetSceneSize(rectCtrl.Width(), rectCtrl.Height());
wglMakeCurrent(this->GetDC()->GetSafeHdc(), m_hRC);
RenderScene();
SwapBuffers(m_pDC->m_hDC);
wglMakeCurrent(m_pDC->m_hDC, NULL);
}
void View1::Init()
{
GLuint glnPixelFormat;
static PIXELFORMATDESCRIPTOR pfd  = {
sizeof(PIXELFORMATDESCRIPTOR), //size of this pfd
1, //version number
PFD_DRAW_TO_WINDOW | //support window
PFD_SUPPORT_OPENGL | //support OpenGL
PFD_DOUBLEBUFFER, //double buffered
PFD_TYPE_RGBA, //RGBA type
16, //16-bit color depth
0, 0, 0, 0, 0, 0, //color bits ignored
0, //no alpha buffer
0, //shift bit ignored
0, //no accumulation buffer
0, 0, 0, 0, //accum bits ignored
16, //16-bits buffer
0, //no stencil buffer
0, //no auxiliary buffer
PFD_MAIN_PLANE, //main layer
0, //reserved
0, 0, 0 //layer masks ignored
};
         m_pDC=GetDC();
glnPixelFormat = ChoosePixelFormat(m_pDC->m_hDC, &pfd);
SetPixelFormat(m_pDC->m_hDC, glnPixelFormat, &pfd);
m_hRC = wglCreateContext(m_pDC->m_hDC);
wglMakeCurrent(m_pDC->m_hDC, m_hRC);
glShadeModel(GL_SMOOTH);
glClearColor(255,255,255,0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void View1::SetSceneSize(GLsizei glsWidth, GLsizei glsHeight)
{
float fRatioWH;
fRatioWH = float(glsWidth)/glsHeight;
glViewport(0, 0, glsWidth, glsHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0f, fRatioWH, 0.01f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void View1::RenderScene()
{
glClearColor(250,250,250);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(m_glfViewPosX, m_glfViewPosY, m_glfViewPosZ, 0, 50, 0, m_0, 1, 0);
         DrawGrid();
}
void View1::DrawGrid()
{
glLineWidth(2.0f);
glBegin(GL_LINES);
glColor3f(0,0,0);
//横线
glVertex3f(-m_glfGridUnit*m_nLines, 0, 0);
glVertex3f( m_glfGridUnit*m_nLines, 0, 0);
//纵线
glVertex3f( 0, 0, -m_glfGridUnit*m_nLines);
glVertex3f( 0, 0,  m_glfGridUnit*m_nLines);
//垂线
glVertex3f( 0, 0, 0);
glVertex3f( 0, m_glfGridUnit*m_nLines, 0);
glEnd(); glLineWidth(0.1f);
glBegin(GL_LINES);
glColor3f(120,120,120);
for(int i=1; i<=m_nLines; i++)
{
//横线
glVertex3f(-m_glfGridUnit*m_nLines, 0, m_glfGridUnit*i);
glVertex3f( m_glfGridUnit*m_nLines, 0, m_glfGridUnit*i);
glVertex3f(-m_glfGridUnit*m_nLines, 0, -m_glfGridUnit*i);
glVertex3f( m_glfGridUnit*m_nLines, 0, -m_glfGridUnit*i);
//纵线
glVertex3f( m_glfGridUnit*i, 0, -m_glfGridUnit*m_nLines);
glVertex3f( m_glfGridUnit*i, 0,  m_glfGridUnit*m_nLines);
glVertex3f(-m_glfGridUnit*i, 0, -m_glfGridUnit*m_nLines);
glVertex3f(-m_glfGridUnit*i, 0,  m_glfGridUnit*m_nLines);
}
glEnd();
}
void View1::OnLButtonUp(UINT nFlags, CPoint point)
{
m_MouseDownPoint=CPoint(0,0);
ReleaseCapture();
SetFocus();
CView::OnLButtonUp(nFlags, point);
}
void View1::OnMouseMove(UINT nFlags, CPoint point)
{
if (GetCapture()==this)
{
m_rotateX += (point.x-m_MouseDownPoint.x)/100.0f;
m_rotateY += (point.y-m_MouseDownPoint.y)/100.0f; // 限制方向
if(m_rotateY > PI/2.2) m_rotateY = PI/2.2;   
if(m_rotateY < 0.01) m_rotateY = 0.01;
if(m_rotateX > 2*PI) m_rotateX = 0.01;
if(m_rotateX < 0) m_rotateX = 2 * PI;
m_glfViewPosX = m_distance * sin(m_rotateY) * cos(m_rotateX);  
m_glfViewPosZ = m_distance * sin(m_rotateY) * sin(m_rotateX);
m_glfViewPosY = m_distance * cos(m_rotateY);
InvalidateRect(this->GetSafeHwnd(),,FALSE);
m_MouseDownPoint=point;
};
CView::OnMouseMove(nFlags, point);
}
void View1::OnLButtonDown(UINT nFlags, CPoint point)
{
m_MouseDownPoint=point;
SetCapture();
SetFocus();
CView::OnLButtonDown(nFlags, point);
}
void View1::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
wglMakeCurrent(m_pDC->m_hDC, m_hRC);
SetSceneSize(cx, cy);
wglMakeCurrent(m_pDC->m_hDC, NULL);
}
void View1::OnDestroy()
{
wglMakeCurrent(m_pDC->m_hDC, NULL);
wglDeleteContext(m_hRC);
CView::OnDestroy();
}下面是头文件中的变量CPoint m_MouseDownPoint; //鼠标点击位置
CDC* m_pDC;
HGLRC m_hRC;
GLfloat m_distance; //距离
GLfloat m_rotateX; //航向角
GLfloat m_rotateY;     //俯仰角 int m_nLines; //背景网格线数
GLfloat m_glfGridUnit; //网格尺寸
COLORREF m_clrBackgroud, m_clrGridAxse, m_clrGridLine; //背景网格的颜色
GLfloat m_glfViewPosX, m_glfViewPosY, m_glfViewPosZ, //视点坐标

解决方案 »

  1.   

    OnPaint的这段代码放到OnCreate里试下,另外看下任务管理器是否有内存泄露。
    Init();
        CRect rectCtrl;
        GetClientRect(rectCtrl);
        SetSceneSize(rectCtrl.Width(), rectCtrl.Height())
      

  2.   

    检查是否资源泄漏的办法之一:
    在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
    让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!补齐漏掉的
    CloseHandle
    Release
    DeleteObject
    ……
      

  3.   

    暂时没发现什么问题,但是在 OnPaint 里面你就搞了三个dc出来了
    首先 CPaintDC dc(this) 这就是一个
    Init 里面你又来一个 GetDC()
    回到 OnPaint 里面 wglMakeCurrent(this->GetDC()->GetSafeHdc(), m_hRC); 这里你又搞了个CPaintDC 这东西呢,在声明周期结束后会自动释放
    但调用 GetDC 就要有相应的 ReleaseDC,看了下代码也没看到你调用 ReleaseDC
    这里就已经有两个泄漏的地方了而且很明显你后面的两次 GetDC 都是多余的,CPaintDC dc(this) 已经帮你弄了一个dc了你还去获取
    况且在 OnPaint 里面调用 GetDC 是很不明智的,等于要系统帮你再画一次东西
      

  4.   

    我也觉得是ONPAINT,里面wglMakeCurrent(this->GetDC()->GetSafeHdc(), m_hRC); 这句话的问题
      

  5.   

    搜网络教程“学OpenGL编3D游戏”。
      

  6.   

    没有时间再拿出来专门学opengl。
      

  7.   

    没有时间再拿出来专门学opengl。
    参考人家的例子代码为什么不卡。