《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:// ...
随机推荐
- <Stackoverflow> 如何提问
如何提问 欢迎来到Stack Overflow! 我们很乐意帮助你,但是实际情况是并非每一个问题都能得到解决.为了提高你的机会,这儿有一些帮助: 1 检索及调查 在提出你的问题之前,你已经通过检索来寻 ...
- 【Spark学习】Apache Spark for 第三方Hadoop分发版
Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4137979.html
- Standalone Django scripts
Standalone Django scripts DJANGO_SETTINGS_MODULE=foo.settings
- Apache Spark GraphX的简介
简单地说,GraphX是大规模图计算框架. GraphX 是 Spark 中的一个重要子项目,它利用 Spark 作为计算引擎,实现了大规模图计算的功能,并提供了类似 Pregel 的编程接口. Gr ...
- Codeforces 602B Approximating a Constant Range(想法题)
B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had ...
- ZOJ 4114 Detect the Virus(AC自动机)
Detect the Virus Time Limit: 2 Seconds Memory Limit: 65536 KB One day, Nobita found that his co ...
- Spring Autowiring by AutoDetect
In Spring, "Autowiring by AutoDetect", means chooses "autowire by constructor" i ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- 山东理工大学ACM平台题答案关于C语言 1181 C语言实验——最小公倍数和最大公约数
C语言实验——最小公倍数和最大公约数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 从键盘输入两个正整数,求这两个正整数的最小公 ...
- MYCAT介绍
为什么需要MyCat? http://www.mycat.org.cn/ http://www.csdn.net/article/2015-07-16/2825228