标题:基于对话框的方向键怎么获取
只看楼主
Aqin
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-11
 问题点数:0 回复次数:8 
基于对话框的方向键怎么获取

我最近做了个贪吃蛇游戏,最初是用单文档的,已经成功了,现在想改成基于对话框的,但是按方向键时没有反应(蛇已经动动起来了,但是不能转向)
附部分代码:
void CsnakeDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP: snake1.moveup();break;
case VK_DOWN: snake1.movedown();break;
case VK_RIGHT:snake1.moveright();break;
case VK_LEFT: snake1.moveleft();break;
}
}

void psnake::moveup()
{

for(i=node-1;i>0;i--)
{
x[i]=x[i-1];
y[i]=y[i-1];
}
direction=3; //1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头
y[0]-=10;
}

是有其他控件,但是我是在成组框中画图的,我已经用setfocus让成组框获取焦点了,还是没有反应。

[此贴子已经被作者于2007-6-12 22:10:39编辑过]

搜索更多相关主题的帖子: 方向键 对话框 break case UINT 
2007-06-11 10:36
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
得分:0 

你对话框上面是否还有其它控件,如果有控件就可能导致不能获取,因为输入焦点可能在这些焦点上


2007-06-11 13:24
Aqin
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-11
得分:0 
是有其他控件,但是我是在成组框中画图的,我已经用setfocus让成组框获取焦点了,还是没有反应。
2007-06-12 22:11
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
得分:0 
所以就无法获取WM_CHAR WM_KEYDOWN WM_KEYUP 这些消息,因为你是在对话框中响音,而对话框无输入焦点,所以没办法获取,
你可以用
RegisterHotKey来注册热键

2007-06-13 09:25
Aqin
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-11
得分:0 
我没用过RegisterHotKey,不懂得怎么用,就拿贪吃蛇这个例子能具体点说一下吗?
我上网找了一个关于RegisterHotKey,用键的时候要加多MOD_ALT、MOD_CONTROL、MOD_SHIFT或MOD_WIN这几个键,那玩贪吃蛇时候按方向键的同时再按着另外一个键怎么玩啊,不方便啊
2007-06-13 16:00
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
得分:0 
RegisterHotKey(m_hWnd,1,NULL,VK_UP);
RegisterHotKey(m_hWnd,2,NULL,VK_DOWN);
RegisterHotKey(m_hWnd,3,NULL,VK_LEFT);
RegisterHotKey(m_hWnd,4,NULL,VK_RIGHT);

2007-06-13 16:14
Aqin
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-11
得分:0 
我在snakeDlg.cpp的OnInitDialog()中注册
RegisterHotKey(m_hWnd,1,NULL,VK_RIGHT);
RegisterHotKey(m_hWnd,2,NULL,VK_LEFT);
RegisterHotKey(m_hWnd,3,NULL,VK_UP);
RegisterHotKey(m_hWnd,4,NULL,VK_DOWN);

再在snakeDlg.h中定义了一个响应函数afx_msg void OnHotHey(WPARAM wParam,LPARAM lParam);

(这是我参考网上的afx_msg LRESULT OnHotHey(WPARAM wParam,LPARAM lParam),不知道对不?其实我是不懂这是什么意思 参考网页http://zhidao.baidu.com/question/16324966.html?si=9)

再写实现函数

void CsnakeDlg::OnHotHey(WPARAM wParam,LPARAM lParam)
{
if(wParam==1)snake1.moveright();
if(wParam==2)snake1.moveleft();
if(wParam==3)snake1.moveup();
if(wParam==4)snake1.movedown();
Invalidate();
}

还是没有反应,不知道是那里错,请再指点,万分感谢!

好像少了消息映射
BEGIN_MESSAGE_MAP(CsnakeDlg, CDialog)
……
ON_WM_HOTKEY() //添加了映射,但是出错了,说没有声明这个标识符
……
END_MESSAGE_MAP()

[此贴子已经被作者于2007-6-13 16:52:42编辑过]

2007-06-13 16:35
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
得分:0 
消息用
ON_MESSAGE(WM_HOTKEY,OnHotKey);
函数是
LRESULT OnHotHey(WPARAM wp,LPARAM lp)
{
if ( HIWORD(lp) == VK_UP )
{
}
else if ( HIWORD(lp) == VK_RIGHT )
{
}
return 0;
}

2007-06-13 18:07
Aqin
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-11
得分:0 
真的很感谢您的热心帮助,我终于成功了!真的谢谢了!我会更加顶你们的论坛的!谢谢!
2007-06-14 12:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-146494-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.529710 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved