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.0f 1.0f 0.0f );                     //  上顶点
        glColor3f( 0.0f , 1.0f , 0.0f );
        glVertex3f(
- 1.0f , - 1.0f 0.0f );                     //  左下
        glColor3f( 0.0f , 0.0f , 1.0f );
        glVertex3f( 
1.0f , - 1.0f 0.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.0f 1.0f 0.0f );                     //  左上
        glColor3f( 1.0 , 1.0f , 1.0f );
        glVertex3f(
- 1.0f , - 1.0f 0.0f );                     //  右下

        glColor3f(
0.0f , 0.0f , 1.0f );
        glVertex3f( 
1.0f , - 1.0f 0.0f );                     //  左下
        glColor3f( 0.0f , 1.0f , 0.0f );
        glVertex3f( 
1.0f 1.0f 0.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
}

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是一个供开发人员使用的C++类库,用于创建Windows应用程序。OpenGL是一个跨平台的图形库,可用于创建高性能和交互式的3D图形应用程序。 要实现一个CAD(Computer-Aided Design,计算机辅助设计)应用程序,可以利用MFCOpenGL的结合。 首先,我们可以使用MFC创建一个窗口应用程序,包括菜单、工具栏、状态栏等常见的用户界面元素。然后,我们可以使用MFC提供的图形设备接口(GDI)来处理窗口的基本绘图功能,如绘制线条、矩形等。 接下来,我们可以利用OpenGL来创建一个具有3D绘制能力的视图区域。通过在MFC应用程序集成OpenGL,我们可以使用OpenGL的各种函数和功能来实现CAD应用程序的需求。 在CAD应用程序,我们可以使用OpenGL的3D绘制函数来绘制各种几何图形,如多边形、曲线、曲面等。我们还可以使用OpenGL的变换矩阵来进行平移、旋转和缩放等变换操作。 此外,为了使CAD应用程序具有交互性,我们可以利用MFC的消息处理机制来处理鼠标和键盘事件。例如,当用户点击鼠标时,我们可以捕获鼠标的坐标,并根据用户的操作在OpenGL视图区域绘制相应的图形。 最后,我们可以使用MFCOpenGL的结合来实现一些高级功能,如图形捕捉、实体建模、文件读写等。 总之,利用MFCOpenGL的结合,我们可以实现一个功能强大的CAD应用程序,提供3D绘制能力和丰富的交互性。无论是绘制简单的图形还是进行复杂的工程设计,这个CAD应用程序都能够满足用户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值