• 【转】 《基于MFC的OpenGL编程》Part 6 Keyboard and Mouse Control


    在上一篇的基础上加入对键盘和鼠标的事件处理程序,以便用其来控制3D物体的旋转和移动。

    1,首先在CCY457OpenGLView类中为WM_KEYDOWN, WM_LBUTTONDOWN, WM_LBUTTONUP WM_MOUSEMOVE四个事件加入事件处理函数。

    2,CCY457OpenGLView.h中加入下列用于控制旋转和移动的变量:并在构造函数中初始化:

         GLfloat m_xAngle;
         GLfloat m_yAngle;
         GLfloat m_xPos;
         GLfloat m_yPos;
         CPoint m_MouseDownPoint;
    CCY457OpenGLView::CCY457OpenGLView()
    {
         m_xPos
    = 0.0f
    ;
         m_yPos
    = 0.0f
    ;
         m_xAngle
    = 0.0f
    ;
         m_yAngle
    = 0.0f
    ;
    }

    3,加入绘制代码:

    void COpenGLView::RenderScene ()
    {
         glLoadIdentity();
         glTranslatef(m_xPos, m_yPos,
    -5.0f
    );
         glRotatef(m_xAngle,
    1.0f,0.0f,0.0f
    );
         glRotatef(m_yAngle,
    0.0f,1.0f,0.0f
    );

         glutWireCube(
    1.0f
    );
    }

    4,为四个事件处理函数加入控制代码

    void COpenGLView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        
    // TODO: Add your message handler code here and/or call default

        switch (nChar)
         {
            
    case VK_UP:         m_yPos = m_yPos + 0.1f
    ;
                            
    break
    ;
            
    case VK_DOWN:     m_yPos = m_yPos - 0.1f
    ;
                            
    break
    ;
            
    case VK_LEFT:     m_xPos = m_xPos - 0.1f
    ;
                            
    break
    ;
            
    case VK_RIGHT:   m_xPos = m_xPos + 0.1f
    ;
                            
    break
    ;
            
    default:         MessageBox("Press the arrow keys only"
    );
                            
    break
    ;
         }        

         InvalidateRect(NULL,FALSE);
        
         CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }

    void
    COpenGLView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        
    // TODO: Add your message handler code here and/or call default

         m_MouseDownPoint=point;
         SetCapture();
        
         CView::OnLButtonDown(nFlags, point);
    }

    void
    COpenGLView::OnLButtonUp(UINT nFlags, CPoint point)
    {
        
    // TODO: Add your message handler code here and/or call default

         m_MouseDownPoint=CPoint(0,0);
         ReleaseCapture();
        
         CView::OnLButtonUp(nFlags, point);
    }

    void
    COpenGLView::OnMouseMove(UINT nFlags, CPoint point)
    {
        
    //
    TODO: Add your message handler code here and/or call default
        
    // Check if we have captured the mouse

        if (GetCapture()==this)
         {
            
    //Increment the object rotation angles

             m_xAngle+=(point.y-m_MouseDownPoint.y)/3.6;
             m_yAngle
    +=(point.x-m_MouseDownPoint.x)/3.6
    ;
            
    //Redraw the view

             InvalidateRect(NULL,FALSE);
            
    //Set the mouse point

             m_MouseDownPoint=point;
         };
        
         CView::OnMouseMove(nFlags, point);
    }

  • 相关阅读:
    javascript:;禁用a标签默认功能的缺点。
    chrome中image图片预留位置的问题
    line-height和vertical-algin
    关于font-size对垂直居中影响的问题
    网络OSI七层模型及各层作用 与 TCP/IP
    NB-IoT,LoRA,WIFI,蓝牙,Zigbee,MQTT,CoAP之间的关系
    常见的十大物联网通讯技术优劣及应用场景
    物联网的七大通信协议
    设备树DTS 学习:学习总结
    设备树DTS 学习:Linux DTS文件加载过程
  • 原文地址:https://www.cnblogs.com/lcxu2/p/2004062.html
Copyright © 2020-2023  润新知