下面的例子是一个用WM-CHAR消息的W,S,A,D按键代表上下左右控制小球运动的示例:
大家先把下列代码编译了按W,S,A,D按键会发现小球没反应,
(详细介绍小球没反应和一些思路在下面)
#include<afxwin.h>
class CMainWnd:public CFrameWnd{
public:
CMainWnd():uAddX(0),uAddY(0),ptBall(0,0){
Create(NULL,"show",WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION,
CRect(0,0,400,400),NULL,NULL,WS_EX_OVERLAPPEDWINDOW);
}
void OnPaint();
void OnChar(UINT,UINT,UINT);
void OnTimer(UINT);
protected:
UINT uAddX;
UINT uAddY;
CPoint ptBall;
DECLARE_MESSAGE_MAP();
};
BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd)
     ON_WM_PAINT()
 ON_WM_CHAR()
 ON_WM_TIMER()
END_MESSAGE_MAP()
class CWinMain:public CWinApp{
public:
virtual BOOL InitInstance(){
m_pMainWnd=new CMainWnd;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
m_pMainWnd->SetTimer(1,500,NULL);
return TRUE;
}
}theMain;
void CMainWnd::OnPaint(){
CDC *pDC=this->GetDC();
pDC->Ellipse(ptBall.x*20,ptBall.y*20,
ptBall.x*20+20,ptBall.y*20+20);
ValidateRect(NULL);
}
void CMainWnd::OnTimer(UINT){
if(uAddX+ptBall.x<0||uAddX+ptBall.x>=20||
uAddX+ptBall.y<0||uAddX+ptBall.y>=20){
if(IDOK==MessageBox("error!")){
ptBall.x=uAddX=0;
ptBall.y=uAddY=0;
}
}
else
ptBall+=CPoint(uAddX,uAddY);
}
void CMainWnd::OnChar(UINT nChar,UINT,UINT){
if(nChar=='w'){
uAddX=0;
uAddY=-1;
}
else if(nChar=='s'){
uAddX=0;
uAddY=1;
}
else if(nChar=='a'){
uAddX=-1;
uAddY=0;
}
else if(nChar=='d'){
uAddX=1;
uAddY=0;
}
}
这个程序在VC6.0下调试通过。
我的让小球受键盘控制的思路如下:
首先介绍一下小球的运动。。
原要求:
一开始小球静止,
当按下WSAF这几个字母的时候。
小球开始按要求地向指定方向运动,
直到程序关闭或移动出界或者改变了原来移动的方向。
也就是说当前面提到的事件没发生,
不用继续按方向键小球会继续向原方向作匀速直线运动。
再说一下我绘小球的思路。
这是个Frame窗口且一般SIZE不会发生变化。
它是个长400个相素的正方型。
我把他横竖都分了20个不重合的长20个相素的小段。。
可以把这个大正方形分为400个边长20相素的小正方形,
并且小球我打算画在这些小正方形内部,
所以我为每一个小正方形分了一个相对逻辑坐标,
横由0-19(都包含),
竖由0-19。
再说一下我的实现思路:
我打算用SetTimer设置的计时器,
来完成小球的惯性运动部分(
比如说:
小球要向右走。。
那么在合法的范围下,
小球的相对逻辑横坐标加上1
相对逻辑纵坐标不变。。
小球要向左走。。
那么在合法的范围下,
小球的相对逻辑横坐标加上-1
相对逻辑纵坐标不变。。
上下运动也是同样的道理。
上运动相对逻辑纵坐标-1,
下运动相对逻辑纵坐标+1
以上两个相对逻辑横坐标不变。
)。。
那么在按WSAD的时候分别就在
uAddX中设置小球运动要增加的横坐标的相对逻辑值,
uAddY中设置小球运动要增加的纵坐标的相对逻辑值。
那么我就设想运行结果应该是当我按下D时小球开始向右运动,
按下时小球转下运动。。
但是运行结果是按WSAD键都没反应。
我就是想解决这个问题。。

解决方案 »

  1.   

    ..
    恩我承认我比较喜欢CFrameWnd而荒废了其他的同级别的类了。。
    我会尝试去学习一下CView类。。
    但是我希望LS能详细一些。。
    比如说把上面的代码改为能用的(功能和预想相差无几的)代码。。
    并且,
    我没能自己写出能用的(功能和预想相差无几的)代码或有人能帮助我改过来且让我明白的时候。。
    这个问题还没有解决。。
    ------------------------------------我的语气有问题吗??
      

  2.   

    没在CView中找到合适的我了解的东西解决这个问题