zoukankan      html  css  js  c++  java
  • 【转】 《基于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);
    }

  • 相关阅读:
    WSS 扩展文件夹的属性如何给文件夹添加扩展字段
    SharePoint 打开文档附件不弹出提示框
    SharePoint2010 安装时报“未能启动数据库服务 MSSQL$Sharepoint"解决办法
    常见问题
    sharepoint 关于pdf格式在线打开
    ASP.NET 2.0 连接Sql Server 2005报错 [DBNETLIB][ConnectionOpen (Invalid Instance()).]无效的连线。
    <转>SQL Server 2008 R2十大新特性解析
    windows查看端口占用情况
    SQL Server适用脚本收集一
    信息系统中用户的域AD认证功能
  • 原文地址:https://www.cnblogs.com/lcxu2/p/2004062.html
Copyright © 2011-2022 走看看