MFC中OpenGL旋转的问题

      要求用户不干涉的情况下让物体自由旋转,这如果用win32sdk直接来实现的话,就像Nehe的教程上那样是比较容易做的,可以在空闲事件的情况下调用绘图部分代码;

    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))    // Is There A Message Waiting?
        {
        
                TranslateMessage(
&msg);                // Translate The Message
                DispatchMessage(&msg);                // Dispatch The Message
        }
        
else                                        // If There Are No Messages
        {
            DrawGLScene();
        }
MFC中我不了解到底该怎么弄才好,起先也是想放到空闲事件处理程序中去调用绘图代码,就写了如下代码:
BOOL COpenGLDemoApp::OnIdle(LONG lCount) 
{
    
// TODO: Add your specialized code here and/or call the base class
    CFrameWnd*   pw=(CFrameWnd*)AfxGetMainWnd();  
    ((COpenGLDemoView
*)pw->GetActiveView())->DrawGLScene();
    
return CWinApp::OnIdle(lCount);
}

可发现效果不对劲,必须要用户的鼠标在上面滑动才会旋转,和要求完全不符合呀。于是我就换了个想法,试着用了一个定时器,让它定时刷新重绘,从而产生出旋转的效果,代码如下:

int COpenGLDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    
if (CView::OnCreate(lpCreateStruct) == -1)
        
return -1;
    
    
// TODO: Add your specialized creation code here
    HWND hWnd = this->GetSafeHwnd();    
    HDC hDC 
= ::GetDC(hWnd);

    
if(this->SetWindowPixelFormat(hDC)==FALSE)
    {
//设置像素格式
        return 0;
    }
    
if(this->CreateViewGLContext(hDC)==FALSE)
    {
//创建RC并选为所用
        return 0;
    }
    
if(!this->InitGL())
    {
//初始化openGL
        return 0;
    }
    
this->SetTimer(1,10,NULL); 
    
return 0;
}
void COpenGLDemoView::OnPaint() 
{
    CPaintDC dc(
this); // device context for painting
    this->DrawGLScene();
}
void COpenGLDemoView::OnTimer(UINT nIDEvent) 
{
    
// TODO: Add your message handler code here and/or call default
    
//控制旋转角度
    rTri+=1.2f;
    
if(rTri>=360.0f)
    {
        rTri
-=360.0f;
    }
    rQuads
-=1.15f;
    
if(rQuads<=-360.0f)
    {
        rQuads
+=360.0f;
    }

    InvalidateRect(NULL,FALSE);
//角度更新了,通知其重绘
    CView::OnTimer(nIDEvent);
}
int COpenGLDemoView::DrawGLScene()                                   
{
// Here's Where We Do All The Drawing
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // Clear Screen And Depth Buffer
    glShadeModel(GL_SMOOTH);
    glLoadIdentity();                                    
// Reset The Current Modelview Matrix
    glTranslatef(-1.5f,0.0f,-6.0f);//物体左移1.5,向内移6,相当于移动镜头一样,让物体进入镜头中
    glRotatef(rTri,0.0f,1.0f,0.0f);
    glBegin(GL_TRIANGLES);                            
// 绘制三角形
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f( 
0.0f1.0f0.0f);                    // 上顶点
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(
-1.0f,-1.0f0.0f);                    // 左下
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f( 
1.0f,-1.0f0.0f);                    // 右下
    glEnd();                                // 三角形绘制结束
    glShadeModel(GL_FLAT);
    glLoadIdentity();
    glTranslatef(
1.5f,0.0f,-6.0f);
    glRotatef(rQuads,
1.0f,0.0f,0.0f);
    glBegin(GL_QUADS);                            
//  绘制正方形
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f(
-1.0f1.0f0.0f);                    // 左上
        glColor3f(1.0,1.0f,1.0f);
        glVertex3f(
-1.0f,-1.0f0.0f);                    // 右下

        glColor3f(
0.0f,0.0f,1.0f);
        glVertex3f( 
1.0f,-1.0f0.0f);                    // 左下
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f( 
1.0f1.0f0.0f);                    // 右上
    glEnd();                                // 正方形绘制结束
    glFlush();
    rTri
+=1.2f;
    
if(rTri>=360.0f)
    {
        rTri
-=360.0f;
    }
    rQuads
-=1.15f;
    
if(rQuads<=-360.0f)
    {
        rQuads
+=360.0f;
    }
    HWND hWnd 
= this->GetSafeHwnd();    
    HDC hDC 
= ::GetDC(hWnd);
    SwapBuffers(hDC);
    
return TRUE;                                        // Everything Went OK
}

      这下旋转的效果是有的,但由于是强制其重绘,所以画面刷新不过来,即使我用了双缓冲,画面还是闪烁得很。这个问题困惑了我一晚上,到底应该怎么弄呢?



posted on   Phinecos(洞庭散人)  阅读(3612)  评论(3编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示