看了七十一雾央的博客后深有感触,决定学习一下,跟着操作,写下自己的心得。
初体验。
2015/06/14/
///by xbw
编译器 visual studio 2013 MFC应用程序
一、键盘响应
键盘响应,是贴图(人物)动起来,游戏都是有互动性的;;;
项目 --类向导---找到消息,搜索---WM_KEYDOWN;
确定 ,,我们会发现在cpp文件中出现了void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数
我们清空其中函数,上代码;--雾央老师
void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nChar)
{
case 'd': //游戏中按下的键当然应该不区分大小写了
case 'D':
m_heroPos.left += 10; //向右移动10个像素的单位
m_heroPos.right += 10; //左边和右边都要移动哦
break;
case 'a':
case 'A':
m_heroPos.left -= 10;
m_heroPos.right -= 10;
break;
case 'w':
case 'W':
m_heroPos.top -= 10;
m_heroPos.bottom -= 10;
break;
case 's':
case 'S':
m_heroPos.top += 10;
m_heroPos.bottom += 10;
break;
}
}
在添加 变量定义 ,,CRect m_heroPos;
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
m_bgcDC.CreateCompatibleDC(NULL);
m_bgBitmap.LoadBitmap(IDB_BITMAP1);
m_hero.Load(_T("images\\me.png"));
m_hero.SetTransparentColor(RGB(0, 0, 255));
m_heroPos.left = 100; //人物左边贴在100的位置
m_heroPos.right = 100 + 60; //人物的右边等于左边加上人物的宽度
m_heroPos.top = 400;
m_heroPos.bottom = 400 + 60;
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
return TRUE;
}
这步添加了贴图的初始位置,,,,
重点来了,这么了我半天,
void CChildView::OnPaint()
{
//CPaintDC dc(this); // 用于绘制的设备上下文
CDC *cDC = this->GetDC(); //获得当前窗口的DC
GetClientRect(&m_client); //获得窗口的尺寸
m_bgcDC.SelectObject(&m_bgBitmap);
cDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_bgcDC, 0, 0, SRCCOPY);
m_hero.Draw(*cDC, m_heroPos);
ReleaseDC(cDC); //释放DC
}
看到了什么东西被注释了吗,没错,就是他,没注释之前,按下WSDA根本就没有反应,测试了半天,才发现,只要注释掉这句就可以了,
运行试试吧,是不是又成功了;
接下来我们再添加鼠标响应
二、鼠标响应
按照同样的方法,类向导,添加WM_LBUTTONDOWN 单击鼠标左键消息
雾央老师还总结了如下,,,,
WM_LBUTTONDBLCLK 双击鼠标左键消息
WM_LBUTTONDOWN 单击鼠标左键消息
WM_LBUTTONUP 松开鼠标左键消息
WM_MBUTTONDBLCLK 双击鼠标中键(滚轮)消息
WM_MBUTTONDOWN 单击鼠标中键(滚轮)消息
WM_MBUTTONUP 松开鼠标中键(滚轮)消息
WM_RBUTTONDBLCLK 双击鼠标右键消息
WM_RBUTTONDOWN 单击鼠标右键消息
WM_RBUTTONUP 松开鼠标右键消息
WM_MOUSEMOVE 鼠标移动消息
WM_MOUSEWHEEL 鼠标滚轮转动消息
又会出现相应的函数
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_heroPos.left = point.x;
m_heroPos.right = m_heroPos.left + 60;
m_heroPos.top = point.y;
m_heroPos.bottom = m_heroPos.top + 60;
}
此时键盘跟鼠标都可以使贴图移动了;;;
补充一下,,,消息响应 ,,,
键盘
UINT nChar 指定特定键的虚键控代码。大家是不是很疑惑,我们收到按键消息后,怎么知道是哪个键被按下了呢?答案就是nChar这个参数了。大家如果按下了某个字母键,那么nChar存储的就是这个字母键的ASCII码,如果是上下左右键呢,那么就分别是VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN这几个宏了。其他的键游戏中使用不多,我就不多说了,若有需要,大家百度“按键的虚拟值“即可查到。
UINT nRepCnt,保存了键被重击的次数。
UINT nFlags ,定扫描代码,键转换代码,前一个关键状态。
鼠标
参数一:nFlags
指示是否各种虚拟键是否被按下。这个参数可以是任何以下值的组合:
MK_CONTROL 如果Ctrl键按下时设置这个标志。
MK_LBUTTON 如果鼠标左键按下时设置这个标志。
MK_MBUTTON 如果鼠标中键按下时设置这个标志。
MK_RBUTTON 如果鼠标右键按下时设置这个标志。
MK_SHIFT 如果Shift键按下时设置这个标志。
这个大家也可以不用管,在我们的教程中几乎用不到。
参数二:CPoint point
大家查看CPoint类型就可以发现,它包含两个成员变量x和y,就分别是鼠标的位置了,注意是相对于窗口左上角的,我想大家都知道程序中窗口的左上角是(0,0)点,向右为x正方向,向下为y正方向吧。
我们的程序就设定为点击鼠标左键后,将人物的左上角移动到鼠标的位置。
-----------引用雾央老师,,,,