MFC 坦克定位
最近学习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()
哈哈,现在能控制坦克的上下左右了。
自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】