《基于MFC的OpenGL编程》Part 6 Keyboard and Mouse Control

本文介绍如何通过键盘和鼠标事件实现OpenGL视图中3D物体的旋转和平移操作。具体包括了事件处理函数的编写、控制变量的定义及初始化、绘制场景的方法更新,以及响应键盘箭头键和鼠标左键移动的控制逻辑。
在上一篇的基础上加入对键盘和鼠标的事件处理程序,以便用其来控制3D物体的旋转和移动。

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

2,CCY457OpenGLView.h中加入下列用于控制旋转和移动的变量:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->GLfloatm_xAngle;
GLfloatm_yAngle;
GLfloatm_xPos;
GLfloatm_yPos;
CPointm_MouseDownPoint;

并在构造函数中初始化:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CCY457OpenGLView::CCY457OpenGLView()
{
m_xPos
=0.0f;
m_yPos
=0.0f;
m_xAngle
=0.0f;
m_yAngle
=0.0f;
}

3,加入绘制代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCOpenGLView::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,为四个事件处理函数加入控制代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->voidCOpenGLView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
caseVK_UP:m_yPos=m_yPos+0.1f;
break;
caseVK_DOWN:m_yPos=m_yPos-0.1f;
break;
caseVK_LEFT:m_xPos=m_xPos-0.1f;
break;
caseVK_RIGHT:m_xPos=m_xPos+0.1f;
break;
default:MessageBox("Pressthearrowkeysonly");
break;
}

InvalidateRect(NULL,FALSE);

CView::OnKeyDown(nChar,nRepCnt,nFlags);
}

voidCOpenGLView::OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_MouseDownPoint=point;
SetCapture();

CView::OnLButtonDown(nFlags,point);
}

voidCOpenGLView::OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_MouseDownPoint=CPoint(0,0);
ReleaseCapture();

CView::OnLButtonUp(nFlags,point);
}

voidCOpenGLView::OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
//Checkifwehavecapturedthemouse
if(GetCapture()==this)
{
//Incrementtheobjectrotationangles
m_xAngle+=(point.y-m_MouseDownPoint.y)/3.6;
m_yAngle
+=(point.x-m_MouseDownPoint.x)/3.6;
//Redrawtheview
InvalidateRect(NULL,FALSE);
//Setthemousepoint
m_MouseDownPoint=point;
};

CView::OnMouseMove(nFlags,point);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值