我的程序是基于MFC的OpenGL程序,用了MFC窗口分割,左边是控件区,右边是视区。在程序中我实现了这样一个功能,就是点击左边控件区的一个按钮时,右边视区就会显示出一个对应的模型,比如说,我点击左边控件区的“汽车”按钮,右边视区就会出现“汽车”的模型。但我遇到了一个鼠标响应的问题,就是当我改变一个模型的状态时,比如用鼠标旋转当前的这个模型,或放大、缩小当前的这个模型,当我点击另一个模型时,这个模型的状态就和上一个模型的状态一样了,比如旋转到某个状态,放大、缩小到某个状态。请问是怎么回事呢?请各位大侠帮看看,先谢谢啦!以下是相关代码:这是Render()中的代码:
glPushMatrix();
glTranslatef( m_modpos.camPos[0], m_modpos.camPos[1], m_modpos.camPos[2] );
glRotatef( m_modpos.camRot[0], 1.0F, 0.0F, 0.0F );
glRotatef( m_modpos.camRot[1], 0.0F, 1.0F, 0.0F );
glRotatef( m_modpos.camRot[2], 0.0F, 0.0F, 1.0F );

glTranslatef(m_modpos.scenePos[0], m_modpos.scenePos[1], m_modpos.scenePos[2]);
glRotatef( m_modpos.sceneRot[0], 1.0F, 0.0F, 0.0F );
glRotatef( m_modpos.sceneRot[1], 0.0F, 1.0F, 0.0F );
glRotatef( m_modpos.sceneRot[2], 0.0F, 0.0F, 1.0F );

 DrawAxis(GL_RENDER);//画十字线

if (select==0)
{
glPushMatrix();
glScalef(3.0f,3.0f,3.0f);
glTranslatef(0.0f,-5.0f,0.0f);
g_3dsModel[0]->Draw();
glPopMatrix();
}
else if (select==1)
{
glPushMatrix();
glScalef(2.5f,2.5f,2.5f);
glTranslatef(0.0f,-3.0f,0.0f);
g_3dsModel[1]->Draw();
glPopMatrix();
}
glPopMatrix();这是鼠标响应的相关代码:
void COpenGLView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if(mouserightdown)
{
SetCamPos(2, -(point.y - mouseprevpoint.y) , TRUE,TRUE);
}
else if(mouseleftdown)
{
SetSceneRot(0, (point.y - mouseprevpoint.y) , TRUE,TRUE);
SetSceneRot(2, (point.x - mouseprevpoint.x) , TRUE,TRUE);
}

mouseprevpoint.x = point.x;
mouseprevpoint.y = point.y;


CView::OnMouseMove(nFlags, point);
}void COpenGLView::OnLButtonUp(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
ReleaseCapture( );
mouseleftdown = FALSE;
SetSceneRot(0, (point.y - mouseprevpoint.y) , TRUE, TRUE);
SetSceneRot(2, (point.x - mouseprevpoint.x) , TRUE, TRUE);
CView::OnLButtonUp(nFlags, point);
}void COpenGLView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
SetCapture();
mouseleftdown=TRUE;
mouseprevpoint.x = point.x;
mouseprevpoint.y = point.y;

CView::OnLButtonDown(nFlags, point);
}void COpenGLView::OnRButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
SetCapture();
mouserightdown=TRUE;
mouseprevpoint.x=point.x;
mouseprevpoint.y=point.y;

CView::OnRButtonDown(nFlags, point);
}void COpenGLView::OnRButtonUp(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
ReleaseCapture();
mouserightdown=FALSE; SetCamPos(2, (point.y - mouseprevpoint.y) , TRUE, TRUE);

CView::OnRButtonUp(nFlags, point);
}

解决方案 »

  1.   

    没看代码
    set Projection ....
    set View.....    -->你的鼠标缩放参数在这之前设置完毕display your 3D Objects here  -->  你的模型替换后在这里显示
    如果只是替换了3DObjects的信息,那就会保持之前的View状态在替换3D Object的同时,将视图设置等参数初始化
      

  2.   


    lTranslatef( m_modpos.camPos[0], m_modpos.camPos[1], m_modpos.camPos[2] );
        glRotatef( m_modpos.camRot[0], 1.0F, 0.0F, 0.0F );
        glRotatef( m_modpos.camRot[1], 0.0F, 1.0F, 0.0F );
        glRotatef( m_modpos.camRot[2], 0.0F, 0.0F, 1.0F );
         
        glTranslatef(m_modpos.scenePos[0], m_modpos.scenePos[1], m_modpos.scenePos[2]);
        glRotatef( m_modpos.sceneRot[0], 1.0F, 0.0F, 0.0F );
        glRotatef( m_modpos.sceneRot[1], 0.0F, 1.0F, 0.0F );
        glRotatef( m_modpos.sceneRot[2], 0.0F, 0.0F, 1.0F );
    把这些参数设为你想要的初始值
      

  3.   

    你好,二楼的这位大哥,我想再请教你个问题,我最近在做个东西,就是:我想把NeHe教程第46节全屏反走样的代码移植到MFC中,在MFC生成的窗口添加抗锯齿功能,但在调用SetPixelFormat的时候提示“无效的像素格式”。查了很多资料后才知道,是因为:“每个窗口只能设置一次像素格式,窗口的像素格式一旦确立无法更改”,所以MFC的窗口在检测是否支持多重采样后,必须将其销毁重新创建。请问:如何实现MFC窗口的再创建呢?我是在MFC的View类中处理的!请赐教啊!
      

  4.   


    2# 好像是我,不过我没看过nehe,抗锯齿也只知道是提高线或点的显示质量,我看过你的另外一个帖子,不会。每个窗口只能设置一次像素格式,窗口的像素格式一旦确立无法更改----- 这个确实只会在初始化时被调用一次。
      

  5.   

         各位楼主们,你们好!!
    就楼主liuhailong520 问的第一个问题,我想追问下,我的程序是基于MFC的OpenGL程序,用了MFC窗口分割,左边是控件区,右边是视区。在程序中我实现了这样一个功能,就是点击左边控件区的一个按钮时,右边视区就会显示出一个对应的模型,比如说,我点击左边控件区的“汽车”按钮,右边视区就会出现“汽车”的模型。各位高手能否将点击事件改为点击控件拖动事件到视区相应的位置再显示???
    请赐教,本人不甚感激...