本系列文章由七十一雾央编写,转载请注明出处。

 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游戏开发》笔记二到这里就结束了,更多精彩请关注下一篇。如果您觉得文章对您有帮助的话,请留下您的评论,点个赞,能看到你们的留言是我最高兴的事情,因为这让我知道我正在帮助曾和我一样迷茫的少年,你们的支持就是我继续写下去的动力,愿我们一起学习,共同努力,复兴国产游戏。

对于文章的疏漏或错误,欢迎大家的指出。