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

 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游戏开发》笔记二 建立工程、调整窗口的更多相关文章

  1. 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...

  2. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

    本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...

  3. [置顶] 《MFC游戏开发》笔记一 系列简介

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9299121 作者:七十一雾央 新浪微博:http:/ ...

  4. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

  5. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...

  6. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

  7. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  8. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  9. 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...

随机推荐

  1. ES6学习小计

    1.增加了for of语法,对应C#里的foreach,注意ES5中的 for in只会传递0,1,2.....序号,并且是字符for-of循环语句通过方法调用来遍历各种集合.数组.Maps对象.Se ...

  2. 学习使用Markdown标记语言

    学习如何使用Markdown进行文本编辑 使用教程   大家若是经常逛Github,就知道其中有一个文件叫做README.MD.我一开始也不知道这个.MD是什么意思,后来我自己写了一次,就知道了这一种 ...

  3. 【转】并发编程之GCD

    http://blog.xcodev.com/blog/2013/11/04/gcd-intro/ Dispatch Queue Dispatch Queue是一个任务执行队列,可以让你异步或同步地执 ...

  4. NSLog说明

    %@ 对象 %d,%i 整型 (%i的老写法) %hd 短整型 %ld , %lld 长整型 %u 无符整型 %f 浮点型和double型 %0.2f 精度浮点数,只保留两位小数 %x,%X 二进制整 ...

  5. PC问题-可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹?

    问题现象:可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹? 问题原因:目标主机中NetLogon服务未启动. 问题处理:远程打开目标主机,“我的电脑-管理-服务-启动(改为自动) ...

  6. jquery easyui中的dialog拖动超出浏览器问题解决办法

    juqery easyui当鼠标点着拖动超出浏览器后,就回不来了,拉不下的问题: //控制dialog超出浏览器回到原来的地方 var default_left; var default_top;// ...

  7. F - Coins

    F - Coins Time Limit:3000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit St ...

  8. android Handler错误,不同的包Handler

    1. import java.util.logging.Handler;这个包了会自动生成如下方法.当时还觉得和以前的不一样了,本不在意. Handler handler1= new Handler( ...

  9. uva 10152 ShellSort

    //这个算法用到了"相对位置"的思想,并且就本题而言还有一个很重要的结论就是,假设 //移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知, //越先移动 ...

  10. VLAN设置

    A Logical Network is a way of representing networks in your datacenter that have the same connectivi ...