有关windows下键盘连续响应问题
2012-02-10 15:00
169 查看
最近一直在将Nehe opengl程序在MFC下实现,但是到第十课时(“加载3D世界,并在其中漫游”),在MFC下实现的程序跟Nehe源码里面效果差别很大。
首先,Nehe程序旋转移动时感觉很流畅,而自己跟他一样的增量,但是整体运行后感觉不流畅。同时,按住同一个键A时(并不松开),再按另一个键B,响应B键消息,但释放B后,却不在执行A键的消息了,但是此时A键仍然未松开。上网查资料,倒腾半天没搞定,郁闷至极。今天继续倒腾,终于被搞定了。没写过博客,今天就把自己的学习经历记录下来,以后还可回顾回顾。(哎,高考结束后就没写过作文,这描述能力啊...)
开始搞起:
1)刚开始添加了WM_KEYDOWN的消息响应,并加代码如下:
但是每次按下↑键不放,中间会有一段停顿,然后才是连续的效果,而且整体的效果根本不如Nehe程序的效果。同时要是按下↑键不放,再按→键,此时会响应→键消息,但是放开→键后,↑键(此时仍然是按下状态)却不在响应消息,当然在按下→键后不放也回出现中间停顿一会再产生持续的效果。郁闷,上网收了相关问题,有人说设置定时器,也木有具体怎么设置,就继续瞎捣鼓了。
2)设置定时器,将上面的一对代码全放到添加的WM_TIMER消息函数中了,在获取键盘状态上用了 GetAsyncKeyState函数(::GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,如果需要在键盘消息处理程序以外查询按键状态,则需要使用::GetAsyncKeyState()来代替【百度的】) ,代码如下:
但是未添加InvalidateRect放在OnTimer函数下,哎,导致直接失败!!!
虽然浪费了点时间,但是最后还是产生了如Nehe程序般的流畅感,花了大半天时间啊...
等该正确了,发觉花了半天时间弄好的,其实很简单。O(∩_∩)O哈哈~,不过弄出来了,很开心呢啊!
首先,Nehe程序旋转移动时感觉很流畅,而自己跟他一样的增量,但是整体运行后感觉不流畅。同时,按住同一个键A时(并不松开),再按另一个键B,响应B键消息,但释放B后,却不在执行A键的消息了,但是此时A键仍然未松开。上网查资料,倒腾半天没搞定,郁闷至极。今天继续倒腾,终于被搞定了。没写过博客,今天就把自己的学习经历记录下来,以后还可回顾回顾。(哎,高考结束后就没写过作文,这描述能力啊...)
开始搞起:
1)刚开始添加了WM_KEYDOWN的消息响应,并加代码如下:
if (VK_PRIOR) { m_lookUpDown -= 0.2f; } if (VK_NEXT) { m_lookUpDown += 0.2f; } if (VK_RIGHT) { m_lookRL += 1.0f; } if (VK_LEFT) { m_lookRL -= 1.0f; } if (VK_UP) { m_xPos += (float)sin(-m_lookRL * piover180) * 0.05f; m_zPos += (float)cos(-m_lookRL * piover180) * 0.05f; if (m_walkBiasAngle >= 359.0f) { m_walkBiasAngle = 0.0f; } else { m_walkBiasAngle += 10; } m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f; } if (VK_DOWN) { m_xPos -= (float)sin(-m_lookRL * piover180) * 0.05f; m_zPos -= (float)cos(-m_lookRL * piover180) * 0.05f; if (m_walkBiasAngle <= 1.0f) { m_walkBiasAngle = 359.0f; } else { m_walkBiasAngle -= 10; } m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f; }
但是每次按下↑键不放,中间会有一段停顿,然后才是连续的效果,而且整体的效果根本不如Nehe程序的效果。同时要是按下↑键不放,再按→键,此时会响应→键消息,但是放开→键后,↑键(此时仍然是按下状态)却不在响应消息,当然在按下→键后不放也回出现中间停顿一会再产生持续的效果。郁闷,上网收了相关问题,有人说设置定时器,也木有具体怎么设置,就继续瞎捣鼓了。
2)设置定时器,将上面的一对代码全放到添加的WM_TIMER消息函数中了,在获取键盘状态上用了 GetAsyncKeyState函数(::GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,如果需要在键盘消息处理程序以外查询按键状态,则需要使用::GetAsyncKeyState()来代替【百度的】) ,代码如下:
if (GetAsyncKeyState(VK_PRIOR)&0x8000) { m_lookUpDown -= 0.2f; } if (GetAsyncKeyState(VK_NEXT)&0x8000) { m_lookUpDown += 0.2f; } if (GetAsyncKeyState(VK_RIGHT)&0x8000) { m_lookRL += 1.0f; } if (GetAsyncKeyState(VK_LEFT)&0x8000) { m_lookRL -= 1.0f; } if (GetAsyncKeyState(VK_UP)&0x8000) { m_xPos += (float)sin(-m_lookRL * piover180) * 0.05f; m_zPos += (float)cos(-m_lookRL * piover180) * 0.05f; if (m_walkBiasAngle >= 359.0f) { m_walkBiasAngle = 0.0f; } else { m_walkBiasAngle += 10; } m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f; } if (GetAsyncKeyState(VK_DOWN)&0x8000) { m_xPos -= (float)sin(-m_lookRL * piover180) * 0.05f; m_zPos -= (float)cos(-m_lookRL * piover180) * 0.05f; if (m_walkBiasAngle <= 1.0f) { m_walkBiasAngle = 359.0f; } else { m_walkBiasAngle -= 10; } m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f; } CView::OnTimer(nIDEvent);
但是未添加InvalidateRect放在OnTimer函数下,哎,导致直接失败!!!
虽然浪费了点时间,但是最后还是产生了如Nehe程序般的流畅感,花了大半天时间啊...
等该正确了,发觉花了半天时间弄好的,其实很简单。O(∩_∩)O哈哈~,不过弄出来了,很开心呢啊!
相关文章推荐
- 有关windows下键盘连续响应问题
- Cocos2d-x--响应Windows键盘事件
- 有关在Linux虚拟机和Windows下Java JDBC问题与解决
- Windows上特殊功能键盘键值问题
- 服务器响应慢,可能和配置有关,下面有几点说明,关注WAS配置优化问题
- Windows下有关NDK安装出现的问题的总结
- 有关windows在调试ODOO8.0有些问题
- MFC无法响应键盘方向键问题
- 利用钩子函数来捕捉键盘响应的windows应用程序
- 利用钩子函数来捕捉键盘响应的windows应用程序
- 树莓派Raspbian中IDLE键盘响应停滞问题及其解决
- 解决CListBox 响应Shift和Ctrl键盘的问题
- 问题2:有关使用 Hexo 和 GitHub 搭建博客,出现 hexo -d 报错如何解决?(windows下)
- Android软键盘弹出时有关布局的问题
- OGRE缓冲鼠标键盘输入无法响应的问题
- 有关歌曲连续播放的问题。
- 利用钩子函数来捕捉键盘响应的windows应用程序
- 实现Windows应用程序对键盘与鼠标的响应
- 利用钩子函数来捕捉键盘响应的windows应用程序
- 利用钩子函数来捕捉键盘响应的windows应用程序