最近学习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)/-bmpInfo.bmWidth/; //计算出中心位置
this->y=(r.bottom-r.top)/-bmpInfo.bmHeight/; //计算出中心位置 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, , , SRCCOPY); //这句最重要

5. 挂载键盘event:

void Ctest3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 switch (nChar)
{
case VK_LEFT:
this->x-=;
break;
case VK_RIGHT:
this->x+=;
break;
case VK_UP:
this->y-=;
break;
case VK_DOWN:
this->y+=;
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 坦克定位的更多相关文章

  1. MFC关于VS内存释放的定位

    全部在App中完成 1.在 App.h 头文件声明 #ifdef _DEBUGprotected:      CMemoryState m_msOld, m_msNew, m_msDiff;#endi ...

  2. MFC逆向-消息响应函数的定位

    MFC  ==   Microsoft Foundation Class,微软基础类库,他封装了Windows API以便用户更快速的开发界面功能程序然而该库及其庞大而复杂,需要有C++的功底否则很难 ...

  3. VS2010+WinXP+MFC程序 无法定位程序输入点于动态链接库

    1.问题描述 原开发环境:Win7 64位旗舰版,VS2010,ThinkPad T460 出现问题:自己开发的MFC程序在WinXP环境下无法正常运行,弹框“无法定位程序输入点InitializeC ...

  4. [置顶] (奇迹冬瓜)坦克大战[MFC框架]

    经过二次整合 重新放出MFC框架下的坦克大战 采用小窗口 多线程 双缓冲 动画帧化 碰撞检测 接口封装 混音 事件延迟等 力求做到代码与美工的双向化 开场动画 界面一 界面二 游戏界面 结束动画 零积 ...

  5. dll文件:关于MFC程序不能定位输入点

    问题:无法定位程序输入点到动态链接库上...... 过程:找完整个工程文件夹: APS为资源文件: resource.h为定义文件: 完全复制 除主文件以外的所有文件,程序可用: 在主程序框Cpp文件 ...

  6. java selenium (五) 元素定位大全

    页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法.  测试人员应该熟练掌握各种定位方法. 使用最简单,最稳定的定位方法. 阅读目录 自动化测试步骤 ...

  7. 自制MFC消息响应定位器+原理分析

    mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...

  8. MFC 调试方法

    AfxDebugBreak     MFC 提供特殊的 AfxDebugBreak 函数,以供在源代码中对断点进行硬编码:     AfxDebugBreak( ); 在 Intel 平台上,AfxD ...

  9. MFC List Control 控件添加单元格编辑,实现可编辑重写

    在实现随机生成四则运算的个人项目中,目前已经完成基本功能,想要把程序变成一个Windows界面的程序.原本以为学习过MFC,应该很快就能完成.但是由于以前用的都是VC6.0,这次用了VS2010,稍微 ...

随机推荐

  1. git 入门教程之实战 git

    实战 git git 是一款分布式版本控制系统,可以简单概括: 不要把鸡蛋放在一个篮子里,你的一举一动都在监视中. 实战场景 你作为某项目的其中一员或者负责人,和小伙伴们一起开发,大家既有着各自分工互 ...

  2. php post接口,登录功能

    登录功能同注册功能一样,都是使用 post 方法,在执行 sql 语句时,同样要使用 "select * from 表名 where 键名 = 参数" 的查询方式,不同的是: 注册 ...

  3. mac版本查看日志命令

    1. ls -l 列出所有文件目录,并可以查看文件目录的所有权限 2.cd  切换至某个目录 eg: cd /Applications 再继续  ls -l 列出所有文件目录 3.cd .. 返回到上 ...

  4. (转载)SPARKR,对RDD操作的介绍

    原以为,用sparkR不能做map操作, 搜了搜发现可以. lapply等同于map, 但是不能操作spark RDD. spark2.0以后, sparkR增加了 dapply, dapplycol ...

  5. setfont()函数

    设计字体显示效果 Font mf = new Font(String 字体,int 风格,int 字号); 字体:TimesRoman, Courier, Arial等 风格:三个常量 lFont.P ...

  6. mssql sqlserver SQL 位运算举例权限应用

    摘要: 下文通过举例的方式讲述sqlserver中位运算的相关知识,如下所示: 实验环境:sqlserver 2008 R2 在sqlserver的权限设置,我们通常使用1.2.4.8.16.32.6 ...

  7. Java读取.properties配置文件

    一.介绍 Properties文件在Java中主要为配置文件,文件类型为:.properties,格式为文本文件,内容格式为"键=值" 二.读取 这里我采用的是getResourc ...

  8. shell 关于路径查询显示pwd

    获取根目录:dirname $0 cd到根目录:cd `dirname $0` 获取当前目录:pwd 因此,要获取当前目录应该是: cd `dirname $` && pwd 或者 $ ...

  9. node.js cluster模式启用方式

    众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器 ...

  10. 力扣算法题—050计算pow(x, n)

    #include "000库函数.h" //使用折半算法 牛逼算法 class Solution { public: double myPow(double x, int n) { ...