送给初学者的礼物:C++游戏编程起源连载一

2016-02-19 15:54 6 1 收藏

今天图老师小编给大家展示的是送给初学者的礼物:C++游戏编程起源连载一,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】


  第一章 Windows编程基础
  
  简介
  
  本章目的是介绍WINDOWS编程基础。在本章结束时,你应该能够很好的工作了,虽燃可能是简单的WINDOWS程序。你需要有C语言的基础知识,我很少将C++的代码扩充到程序中。当然,由于WINDOWS本身就是面向对象的,一点类的知识是不会对你有什么损害的。假如你不熟悉C++,没有关系,我想你还是能从我这里学到大部分的东西。所有的程序代码都通过了MICROSOFT VISUAL C++6.0的编译,假如你还没有合适的编译器,那就用它好了,还是很棒的。开动吧!
  
  多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它的标准的C的头文件,象stdio.h,conio.h等。除了这些,你还会经常看到在程序的开始有这样一行代码:
  
  
#define WIN32_LEANAND_MEAN

  
  它表示Windows的头文件中将拒绝接受MFC的东西,这将加速你的build时间。假如你从没有打算应用MFC在你的游戏编程中,那就使用它吧。假如你以前从没有看过这种声明类型——在#define后,直接加上一个“单词”,那么它的作用就是有条件编译。看看下面的例子:
  
  
#ifdef DEBUG_MODEprintf("Debug mode is active!");#endif

  
  意思是:假如程序的开始包含#define DEBUG_MODE,那么就printf(),否则退出。这个对于你跟踪程序的逻辑错误是很有帮助的。
  
  WinMain()函数
  
  DOS下的C语言从main()开始,Windows下的C语言从WinMain()开始,一个空的WinMain()函数是这样的:
  
  
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){return(0);}

  
  一个函数即使什么也没做,也应该返回一个值。是的,有好多东西我们不熟悉。首先的首先,WINAPI是个什么声明?WINAPI是在windows.h头文件中定义的一个宏,它把函数调用翻译成正确的调用约定。当我们在程序中需要用到汇编语言的时候,我们在来深究它好了,记住,假如要用WinMain(),就必须要有WINAPI。
  
  下一步让我们来看看括号里的四个参数:
  
  ◎ HINSTANCE hinstance:HINSTANCE是一个句柄类型的标识符。变量hinstance是一个整数,用于标识程序实例。Windows设置这个参数的值,并把它传递给你的程序代码。很多Windows函数都要用到它。
  
  ◎ HINSTANCE hPreInstance:你不用担心这个参数,它已经被废掉了。它只是为古老的Windows版本服务的。你将还会看到类似的情况。
  
  ◎ LPSTR lpCmdLine:是一个指向字符串的指针,它仅在程序名是从DOS命令行输入或是从Run对话框中输入时才起作用。因此,很少被程序代码所用。
  
  ◎ int nCmdShow:决定了窗口在初始显示时的状态。Windows通常给这个参数分配一个值。通常是SW_打头的一个常量。例如SW_SHOWNORMAL表示默认状态,SW_MAXINIZE或SW_MINIMIZE分别表示最大和最小模式等等。
  
  以上大体上是WinMain()的参数的介绍。下面对变量、参数、常量、类等的命名方法介绍一下。
  
  一、消息
  
  当你在DOS下编程的时候,你不必担心其它程序的运行,因为DOS是独占模式。但你在Windows平台上编程时,你不得不考虑其它正在运行的程序。鉴于此,Windows通过“消息”来连接操作申请和具体操作。简单的说,就是我们指示程序或程序本身向Windows发出诸如移动窗口、放大窗口、关闭窗口等申请,Windows再根据申请,考察实地情况,拒绝或发出指令,让程序(计算机)作出相应的动作。再例如,鼠标随时向Windows发出消息,汇报光标位置,左键或右键是否按下等,Windows再根据消息作出相应的反应。总之,无论何时,Windows都要随时掌控所有的消息,而且,Windows是一直不断地接收到各种消息。
  
  这种功能是通过一种被命名为CALLBACK函数类型实现的。不用害怕,消息传递来传递去都是由Windows自己完成的,你只要声明一个CALLBACK函数就可以了,就像WINAPI用在WinMain()前一样。假如还没有明白,不要紧,往下看你就明白了。现在,我要离开这个话题一会儿,因为你只有先建立窗口(Windows),传递消息才有可能实现。 二、窗口类
  
  现在谈论一点C++的知识,因为要想建立一个窗口,你就得先建立一个窗口类。窗口类包含所有的有关窗口的信息,如用什么样的鼠标符号,菜单样式等等。开发任何一个窗口程序,都离不开窗口类的建立。为了达到此目的,你必须填写WNDCLASSEX结构。EX的意思是“扩充”的意思,因为有一个老的结构叫作WNDCLASS,这里,我们将使用WNDCLASSEX结构,它的样子如下:
  
  

   typedef strUCt _WNDCLASSEX {UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;HICON hIconSm;} WNDCLASSEX;

  
  这个结构有不少成员,讨厌的是,你必须为窗口类设置每一个成员。莫发愁,纸老虎一个。让我们来个速成。
  
  ※ UINT cbSize:指定了以字节为单位的结构的大小。这个成员是通过sizeof(WNDCLASSEX)实现的。你将会经常看到它,尤其是你使用了DirectX。
  
  ※ UINT style:指定了窗口的风格。它经常被以CS_打头的符号常量定义。两种或两种以上的风格可以通过C语言中的“或”()运算符加以组合。大多数情况我们只应用四种风格,出于对文章长度的考虑,我们只列出这四种。若你还需要其它的,到MSDN里找一下好了。当然前提是你使用的是Visual C++。
  
  ◎ CS_HREDRAW:一旦移动或尺寸调整使客户区的宽度发生变化,就重新绘制窗口。
  
  ◎ CS_VREDRAW:一旦移动或尺寸调整使客户区的高度发生变化,就重新绘制窗口。
  
  ◎ CS_OWNDC:为该类中的每一个窗口分配一个唯一的设备上下文。
  
  ◎ CS_DBLCLKS:当用户双击鼠标时向窗口过程发送双击消息。
  
  ※ WNDPROC lpfnWndProc:是指向窗口过程的指针。一般都指向CALLBACK函数。假如你没有用过函数指针,简单理解为函数的地址就是函数的名字,名字后面别带括号。
  
  ※ int cbClsExtra:它是为类保留的额外信息 。大多数程序员不用它,你在在写游戏程序时也不太可能用它,所以,设为0好了。
  
  ※ int cbWndExtra:同上一个差不多,设为0好了。
  
  ※ HANDLE hInstance:是指向窗口过程实例的句柄。同时也是WinMain()函数的参数之一。应该设置为hinstance。
  
  ※ HICON hIcon:指向窗口图标的句柄,它通常被LoadIcon()函数设置。在你学会如何在你的程序中使用资源前,你先设置成如下样子:LoadIcon(NULL,IDI_WINLogo)。当然,还有一些其它的IDI_打头的符号常量,可以自己去帮助文件里寻找。
  
  ※ HCURSOR hCursor:指向窗口光标的句柄,它通常被LoadCursor()函数设置,在你学会如何在你的程序中使用资源前,你先用Windows默认的吧,LoadCursor(NULL,IDC_ARROW)。
  
  ※ HBRUSH hbrBackground:当你的窗口过程得到消息,要求刷新(或重画)窗口时,至少要用一种纯色或“brush”(画刷)重画窗口区域,画刷是由参数确定的。你可以使用GetStockObject()函数调用几种常备的画刷,如BLACK_BRUSH, WHITE_BRUSH, GRAY_BRUSH等。现在,你就用GetStockObject(BLACK_BRUSH)吧。也许你觉得我说的太简单了,是因为不想把开始弄得太复杂。在以后的篇幅里会具体讲述的。
  
  ※ LPCTSTR lpszMenuName:假如你想建立一个有下拉菜单的窗口,你得给这个参数赋一个菜单名称(这涉及到资源),由于你还不知道怎么创建菜单,你就先用NULL设置成一个没有菜单的窗口吧。
  
  ※ LPCSTR lpszClassName:很显然,你需要给类起个名字,随你便,如“**”。要用双引号引上。
  
  ※ HICON hIconSm:指向小图标的句柄。小图标用来显示在窗口的标题栏里。要用到LoadIcon()函数,现在,先用Windows默认的吧,LoadIcon(NULL,IDI_WINLogo)。
  
  好了,现在你关于WNDCLASSEX结构知道的已经差不多了,你可以自己设置它了。下面是一个例子:
  
  

来源:https://www.tulaoshi.com/n/20160219/1610674.html

延伸阅读
XML作为全球通用的结构化语言,越来越受人们青睐,各种开发平台(比如Microsoft Studio系列、Oracle系列、Inprise Borland系列等)也都把支持XML开发作为宣传口号之一。在许多项目中利用XML数据交换信息,省去了许多麻烦事,不用制定繁锁的数据格式,利用XML数据易于表达,也利于一线开发者跟踪调试。 在XML应用中,最常用也最实用的莫过于XM...
初学者的化妆步骤 初学者的化妆步骤 初学者正确化妆步骤 化妆步骤1:面部清洁 生活妆对面部皮肤的清洁要求较高,以油性皮肤为例,如果皮肤上的油脂没清洗干净,那么粉底打不上去,即使上去了也很容易脱妆,导致妆容变得花花的。 初学者的化妆步骤 初学者正确化妆步骤 化妆步骤2:修饰眉形 ...
欧莱雅极细造型眉笔 欧莱雅应该是很人都知道的一个品牌,这个品牌目前也是有旗舰店了,所以买的时候也已经很方便了。我个人也是比较喜欢用极细眉笔的,因为我觉得画眉的时候会更加方便。另外这款眉笔非常顺滑,可以帮助我们一笔成型,我们画眉的时候最担心就是卡眉的问题,会让我们的眉毛看起来不自然。 L.A girl极细眉笔 这个品牌也...
C++语言是一个面向对象的语言,使用C++编写的代码更加简捷、高效,更具可维护性和可重用性。但是很多人使用了C++语言后却感到C++与C编程没有什么区别。这其实是由于对C++语言的特点和特色理解和使用不够造成的。事实上,没有任何一个程序员使用C语言的编程效率可以超过C++语言的。 一、使用new和delete进行动态内存分配和...
一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。 !-- frame contents -- !-- /frame contents -- 本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会...

经验教程

740

收藏

75
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部