《MFC游戏开发》笔记二 建立工程、调整窗口
本系列文章由七十一雾央编写,转载请注明出处。
http://blog.csdn.net/u011371356/article/details/9300383
作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5&mod=personinfo
要开发游戏,我们得首先建立一个MFC项目(废话,没工程怎么写代码,呵呵)。对于MFC,我先简单的介绍几句吧。用百度百科的话来说就是:“MFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class
libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。”
要想学好MFC,弄清楚它的原理是需要学习很长时间的,也是蛮困难的一件事情,但是对于利用它做一些应用或者开发一个小游戏并不需要对MFC有多么深刻的理解,而在编程的过程中,大家也会加深对MFC的认识。
我记得当初自己刚接触MFC的时候,对于那一坨文件很是头痛,但是事实上,与我们的开发有关的文件就那么两三个,不需要理解MFC底层是怎么运行的,同样可以先开发。所以,无论有没有接触过MFC,都是可以很快的利用它来开发的,至于它的原理,大家可以在开发过几个程序,有一定的感性认识后,再去系统的学习。另外,在本文的最后,我会简单介绍windows的消息机制。
下面,就让我们先动手建立一个MFC工程吧。
为了照顾新手,对于每一步,我都会给出图文教程,我的开发环境是VS2010,WIN7。
一、建立MFC单文档应用程序
1.打开你的VS2010,建立新项目,选择MFC应用程序
2.点击确定,出现以下界面
3.点下一步
在这个界面,记得取消“文档/视图结构支持”,因为这个我们用不到,还要取消“使用Unicode库”,并且选择“单个文档”,然后点击确定。至于这三种程序类型的区别,大家可以自己勾选试试,也可以问下度娘谷哥。
4.点击确定后
5.继续点下一步,出现下面界面
我用红色框中的部分,这些选中是建立的窗口的一些属性,大家可以自己试试勾选不同的选项,看看分别有什么效果,在这里我们勾选“最小化框”,“系统菜单”这两项即可。然后就可以点击完成了。
6.运行
到这里,工程就已经建立好了,工程的文件目录如下:
大家可以直接点击运行,就会出现下面的结果了
如果大家出现了什么问题,把工程删了重来吧。
二、窗口的调整
1.改变窗口的大小
到这一步,总算是出现了窗口了,可是大家有木有发现,窗口的大小似乎自己改变不了,在建立工程的过程中,并没有设置窗口大小的地方吖,怎么办呢?
这个我们可以通过在程序中加入代码来实现。
大家为自己建立的工程命的名字如果为“XX”,那么大家可以找到“XX.cpp”这个文件,以雾央为例,就是“GameMFC2.cpp”,打开它,找到BOOL CGameMFC2App::InitInstance()函数,在54行的位置,然后在这个函数末尾加上
//设置窗口大小
m_pMainWnd->SetWindowPos(NULL,0,0,811,632,SWP_NOMOVE);
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
其中SetWindowPos函数的第四和第五个参数分别表示窗口的宽度,和高度,大家可以调整这两个参数来改变自己窗口的大小。
PS:这两个参数是包含了窗口边界的,比如高度是包含了标题栏的高度的,如果大家想使游戏画面显示出800x600的,那么宽度和高度大概就需要设置为811x632。
2.删除菜单栏
现在窗口已经可以任意调整大小了,哈哈,可以看着状态栏下面的一些图标什么的总是让人不爽,大家玩游戏的时候没怎么看到过这种东西吧?严重破坏游戏画面啊啊。。。。那么,下面我们就来删掉它们。
这些东西是在建立窗口的时候MFC帮我们生成的,在写一些应用程序的时候很有用,但是对于游戏就成了鸡肋了,不,连鸡肋都比不上。
首先呢,打开工程中的“MainFrm.cpp“,找到43行,显示的是下面这个函数
int CMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)
大家看看里面的内容,微软已经帮我们写好了注释,大家可以看到这个函数在创建菜单栏、工具栏等乱七八糟的玩意,大家对于不想要的东西就可以打大开删戒了。雾央当初学习的时候,就是自己尝试着乱删的,每删除一次,就运行一下,看看少了什么东西,建议大家可以试试。
好了,其实里面的大多数东西我们都是不需要的,删除之后,留下的代码就是
if(CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1; // 基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook); // 创建一个视图以占用框架的工作区
if (!m_wndView.Create(NULL, NULL,AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("未能创建视图窗口\n");
return -1;
}
SetMenu(NULL);
return 0;
是不是少了很多代码?哈哈,来赶紧运行一下看看
嗯,工具栏确实被去掉了,可是菜单栏还在啊,说好的都删呢?
不碍事,再在后面加上一句代码就好了
要加的SetMenu(NULL);
最终这个函数就变成了下面这个样子
int CMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)
{ if (CFrameWndEx::OnCreate(lpCreateStruct) ==-1)
return -1; // 基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook); // 创建一个视图以占用框架的工作区
if (!m_wndView.Create(NULL, NULL,AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("未能创建视图窗口\n");
return -1;
}
SetMenu(NULL);
return 0;
}
嗯,现在再运行试试
啊,Nice啊,一个只有标题栏的空窗口建立成功了。对,就是这么简单,大家成功了没有?
三、关于windows程序的消息机制
windows程序采用了消息机制,当大家点击一下鼠标左键,就产生了一个鼠标点击消息,按下键盘,就产生了键盘消息,windows操作系统为每个程序维护了一个消息队列,每次大家操作后,产生相应的消息,windows会确定这个消息归属的窗口,并将其添加进该窗口的消息队列。
而windows应用程序呢,就在一个while(1)循环中,读取消息队列,当读取到消息后,就进行相应的处理,对于游戏,当没有读取到消息,就绘制画面。
如果大家建立win32 应用程序,就需要自己写建立窗口,显示窗口,消息循环的代码,而MFC将这个过程封装起来了,大家是看不到的,当然也失去了很多灵活性。不过对于我们的游戏开发,影响不是很大。
我这里简略的介绍了下消息机制,只是希望大家能大概的知道windows程序运行的流程,如果想更深入的了解,那么大家可能就需要读一些书,自己研究下了。
从本章开始,以后的文章应该都会有代码文件,有需要代码的同学,请在本章评论下留下自己的邮箱,我会在看到的第一时间内把工程发送给大家。
《MFC游戏开发》笔记二到这里就结束了,更多精彩请关注下一篇。如果您觉得文章对您有帮助的话,请留下您的评论,点个赞,能看到你们的留言是我最高兴的事情,因为这让我知道我正在帮助曾和我一样迷茫的少年,你们的支持就是我继续写下去的动力,愿我们一起学习,共同努力,复兴国产游戏。
对于文章的疏漏或错误,欢迎大家的指出。
《MFC游戏开发》笔记二 建立工程、调整窗口的更多相关文章
- 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...
- [置顶] 《MFC游戏开发》笔记一 系列简介
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9299121 作者:七十一雾央 新浪微博:http:/ ...
- 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- 《MFC游戏开发》笔记五 定时器和简单动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...
随机推荐
- Java基础题
问题: 1.请对比一下重载和重写的区别. 2.请对比一下接口和抽象类的异同. 3.写出一个单例模式,并说明其优点. 4.用过String.StringBuffer吗,说出他们的异同. 5.什么是值传递 ...
- 用Gitolite 构建 Git 服务器
转载 Gitolite 构建 Git 服务器 作者: 北京群英汇信息技术有限公司 网址: http://www.ossxp.com/ 版本: 0.1-1 日期: 2010-10-07 14:52:19 ...
- Tomcat线程池,更符合大家想象的可扩展线程池
因由 说起线程池,大家可能受连接池的印象影响,天然的认为,它应该是一开始有core条线程,忙不过来了就扩展到max条线程,闲的时候又回落到core条线程,如果还有更高的高峰,就放进一个缓冲队列里缓冲一 ...
- 第二百七十九天 how can I 坚持
竟然说我是猪,也是有点受不了了.其实也没什么,无所谓. 一个人有了信仰,不管成不成功,至少不会迷茫. sql语句,left on and 和where,left on是先检索,再关联,主表是完整 ...
- 让UITableViewCell的分隔线宽度等于屏幕的宽度
3种方法: 1.自定义cell: 1).取消系统的分隔线 2).添加一个高度为1,宽度为屏幕宽度的UIView作为cell的子视图,通过设置frame或者约束使这个UIView始终在cell的底部 3 ...
- zznu 1914 asd的甩锅计划
http://acm.zznu.edu.cn/problem.php?id=1914 asd的甩锅计划 时间限制: 1 Sec 内存限制: 128 MB提交: 114 解决: 10[提交][状态] ...
- AppServ 配置还是成功了
安装就不说了,一键式安装,还不错. 首先,登陆密码吧,用户是root ,密码是空: 之前创建的databases都还在, 可以用phpmyadmin管理,不在输入复杂的命令了, 方便,继续鼓捣php.
- eclipse 安装scons
http://www.sconsolidator.com/update Installation To use SConsolidator, you first have to install SC ...
- CTF
今天发现了一个神奇的领域CTF……感觉打开了新世界的大门 http://ctf.idf.cn/里面各种有趣的题目0.0
- HDOJ 1151 Air Raid
最小点覆盖 Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...