当前位置:主页   - 电脑 - 程序设计 - C/C++
《基于MFC的OpenGL编程》Part 6 Keyboard and Mouse Control
来源:网络   作者:   更新时间:2011-01-26
收藏此页】    【字号    】    【打印】    【关闭

  在上一篇的基础上加入对键盘和鼠标的事件处理程序,以便用其来控制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);
}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明