MFC 坦克定位
添加时间:2013-7-23 点击量:
比来进修MFC,写了个用键盘高低阁下移动的坦克界面,结果图:
先用VC++新建一个最简单的MFC项目,基于Dialog的
1. 添加坦克资料:略
2. 添加3个变量:x, y, m_bitmap
int x;
int y;
CBitmap m_bitmap;
3. 在初始化办法中加载bitmap以及设置好初始的坐标地位:
BOOL Ctest3Dlg::OnInitDialog()
{
//略(体系生成的代码略)
this->m_bitmap.LoadBitmapW(IDB_BITMAP2); //BMP文件的资料文件ID
BITMAP bmpInfo;
this->m_bitmap.GetBitmap(&bmpInfo); //获取的宽高等属性
RECT r;
this->GetWindowRect(&r); //获取当前Dialog的宽高等属性
this->x=(r.right-r.left)/2-bmpInfo.bmWidth/2; //策画出中间肠位
this->y=(r.bottom-r.top)/2-bmpInfo.bmHeight/2; //策画出中间肠位
return TRUE;
}
4. 重写OnPaint函数:
CClientDC d(this);
CDC memDC;
memDC.CreateCompatibleDC(&d);
memDC.SelectObject(&m_bitmap);
BITMAP bmpInfo;
this->m_bitmap.GetBitmap(&bmpInfo);
d.BitBlt(this->x, this->y, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCCOPY); //这句最首要
5. 挂载键盘event:
void Ctest3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理惩罚法度代码和/或调用默认值
switch (nChar)
{
case VK_LEFT:
this->x-=10;
break;
case VK_RIGHT:
this->x+=10;
break;
case VK_UP:
this->y-=10;
break;
case VK_DOWN:
this->y+=10;
break;
default:
break;
}
this->InvalidateRect(NULL); //擦除本来的,从头画出(OnPaint中)
CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
6. 因为Dialog中的事务机制,须要参加消息预处理惩罚函数才干让法度真正接管到keydown事务,如下:
BOOL Ctest3Dlg::PreTranslateMessage(MSG pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_KEYDOWN)
{
SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
}
return CDialogEx::PreTranslateMessage(pMsg);
}
上方写的斗劲简单,事务接洽关系没有写进去,不过因为有UI领导帮助建树,所以就没有写,如:
BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialogEx)
ON_WM_PAINT()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
哈哈,如今能把握坦克的高低阁下了。
文艺不是炫耀,不是花哨空洞的文字堆砌,不是一张又一张的逆光照片,不是将旅行的意义转化为名牌包和明信片的物质展示;很多时候它甚至完全不美——它嘶吼、扭曲,它会痛苦地抽搐,它常常无言地沉默。——艾小柯《文艺是一种信仰》
比来进修MFC,写了个用键盘高低阁下移动的坦克界面,结果图:
先用VC++新建一个最简单的MFC项目,基于Dialog的
1. 添加坦克资料:略
2. 添加3个变量:x, y, m_bitmap
int x;
int y;
CBitmap m_bitmap;
3. 在初始化办法中加载bitmap以及设置好初始的坐标地位:
BOOL Ctest3Dlg::OnInitDialog()
{
//略(体系生成的代码略)
this->m_bitmap.LoadBitmapW(IDB_BITMAP2); //BMP文件的资料文件ID
BITMAP bmpInfo;
this->m_bitmap.GetBitmap(&bmpInfo); //获取的宽高等属性
RECT r;
this->GetWindowRect(&r); //获取当前Dialog的宽高等属性
this->x=(r.right-r.left)/2-bmpInfo.bmWidth/2; //策画出中间肠位
this->y=(r.bottom-r.top)/2-bmpInfo.bmHeight/2; //策画出中间肠位
return TRUE;
}
4. 重写OnPaint函数:
CClientDC d(this);
CDC memDC;
memDC.CreateCompatibleDC(&d);
memDC.SelectObject(&m_bitmap);
BITMAP bmpInfo;
this->m_bitmap.GetBitmap(&bmpInfo);
d.BitBlt(this->x, this->y, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCCOPY); //这句最首要
5. 挂载键盘event:
void Ctest3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理惩罚法度代码和/或调用默认值
switch (nChar)
{
case VK_LEFT:
this->x-=10;
break;
case VK_RIGHT:
this->x+=10;
break;
case VK_UP:
this->y-=10;
break;
case VK_DOWN:
this->y+=10;
break;
default:
break;
}
this->InvalidateRect(NULL); //擦除本来的,从头画出(OnPaint中)
CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
6. 因为Dialog中的事务机制,须要参加消息预处理惩罚函数才干让法度真正接管到keydown事务,如下:
BOOL Ctest3Dlg::PreTranslateMessage(MSG pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_KEYDOWN)
{
SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
}
return CDialogEx::PreTranslateMessage(pMsg);
}
上方写的斗劲简单,事务接洽关系没有写进去,不过因为有UI领导帮助建树,所以就没有写,如:
BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialogEx)
ON_WM_PAINT()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
哈哈,如今能把握坦克的高低阁下了。
文艺不是炫耀,不是花哨空洞的文字堆砌,不是一张又一张的逆光照片,不是将旅行的意义转化为名牌包和明信片的物质展示;很多时候它甚至完全不美——它嘶吼、扭曲,它会痛苦地抽搐,它常常无言地沉默。——艾小柯《文艺是一种信仰》