看看窗口函数的定义: 函数原型 LRESULT CALLBACK WndProc ( HWND hwnd , UINT message , WPARAM LPARAM wParam , lParam ); 这里有四个参数。第一个是指窗口句柄,我们因该很熟悉了。第二个是消息标识符,每个 消息对应一个唯一的标识符。第三、第四个参数为 32 位的消息参数,其值根据消息的不同而不 同。 消息处理语句一般是由 switch 语句实现: switch ( message ) { case WM_CREATE :…………… ; return 0 ; case WM_XXXXX:……………… ; GetClientRect ( hwnd , &rect ) ; return } return DefWindowProc ( hwnd , message , wParam , lParam ) ; 所有的消息处理之后, 返回 0; 如果不经由 switch 分支语句处理的消息, 交由 DefWindowProc 函数处理,这是 Windows 默认的消息处理函数。 这里,switch 语句中出现了三个分支,分别处理三类消息。 ◆ WM_CREATE 初始消息,表示窗口显示前进行的处理。在这里,我们让它弹出了一个对话框,并 发出一个系统声音。 ◆ WM_PAINT WM_PAINT 消息以 BeginPaint 函数开始,以 EndPaint 函数结束。这个消息处理部 分使得系统可以根据变化及时更新用户区。比如,如果将另一个窗口激活,可能会覆盖 这个窗口,原窗口中得 Hello Windows 就不可见了,当我们从新激活窗口是,这部分 负责重新绘制窗口,使得窗口有效。 下面看看里面得语句: GetClientRect ( hwnd , &rect ) ; 这个语句将获取用户区域的大小、 位置等信息。 &rect 是一个指向 RECT 结构的指针, 这个结构由四个 Long 类型数据组成,分别表示一个矩形区域的左上、右下点的坐标。 DrawText ( hdc , TEXT ( "Hello , Windows !") , 0 ; ……………………………………. Windows 下的 C/C++编程 -1 , &rect , DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; 这个语句就是在窗口正中间显示 Hello Windows 的语句。参数描述见下表(见表 1-7) : 参数 hdc TEXT ( "Hello , Windows !") -1 &rect DT_SINGLELINE | DT_CENTER | DT_VCENTER 说明 由 BeginPaint 函数返回的显示设备描述句柄 显示的字符串 输出的字符数,-1 表示字符串以 0 结尾 实际用户区 显示方式,对应为:同一行,水平居中,垂 直居中 表 1-7 DrawText 参数 ◆ WM_DESTROY 指示 Windows 清除窗口,比如点击了关闭按钮。 PostQuitMessage ( 0 ); 这个语句就是在消息队列中插入一个 WM_QUIT 消息,使得 while 循环的值为 0,跳 出主循环。执行 return msg. wParam ; 并中止程序运行。 到这里,已经把一个最基本的 Windows 程序讲解完了。其中的关键就是理解 Windows 消息 循环的处理机制。建议大家多思考一下,这对后面的游戏编程的理解有很大的帮助。 控制图标和光标 上面就是 Windows 程序的基本框架,而且也详细分析了每一个语句。应为是基本框架,只 要了解就可以了,所以在程序中没有加入注释。以后的程序都是对这个基本框架的增减和修改, 这就有必要加上注释了, 这不仅保证了程序的可读性, 让其他的人员可以有效地明白程序的作用, 同时也方便自己,谁也不能保证在编写了几千行代码之后还清楚的记得前面的代码的作用,但是 如果有注释的话,大多数人会马上想起来,大脑真是奇妙。 1)控制图标 图标就是在 Windows 中看见的各种各样的用以表示不同文件类型的图案。 基本上 Windows 为 每种文件类型都指定一个图标,但是,大多数程序会改变这个设置,把图标换成自己个性化的图 案。 Windows 下的 C/C++编程 在上一节中, 完成了 Hello World Windows 程序, 系统自动的对它进行编译, 生成的 .EXE 文 件就存放在 Debug 子目录下。它的图标就是 Windows 系统默认的图标(见图 1-11) 。 图 1-11 系统默认的图标 现在,来改变这个文件的图标。 首先,新建一个工程,命名为 Hello World Icon,其他步骤就像上一节一样,不过可以把 WM_CREATE 消息中的 MessageBox 和 MessageBeep 函数删了, 它对我们这一节的程序没什么用处, 但是 return 语句要保留。 下面, 通过 File 菜单的 New 选项, 创建一个资源文件, 就是在弹出的对话框中选中 Resource Script,选中 Add to project 选框,这里将这个 Resource Script 文件命名为 Resource,点击 OK 按钮(见图 1-12) : 图 1-12 Resource 选项 这样,在工程中加入了一个后缀名为 .rc 的文件,系统同时为他创建了一个 .h 文件,我 们可以暂时不去理会它,一切交与系统处理。 下一步,点中在左边的窗口中 Resource.rc ,右边将出现一个文件夹样的图标,点中它, 然后点鼠标右键,就会弹出一个选项窗口,选取 Insert 选项(见图 1-13) : Windows 下的 C/C++编程 图 1-13Insert 选项 然后,又会弹出一个窗口,选择 Icon,也就是图标文件,再点击 New 按钮,新建一个 图标文件(见图 1-14) : 图 1-14 新建图标文件 这时,就可以利用 Microsoft Visual C++ 6.0 来绘制想要的图标了,这里简单的画了一个 Hello 的字样(见图 1-15) : 图 1-15 绘制图标文件 当然,也可以用其他的绘图软件进行图标的编辑,网上有专门的图标编辑软件,可以下载。 在后面的游戏编程中,还会使用比较有个性化的图标。 下一步,就是改变 .EXE 文件的图标了。 Windows 下的 C/C++编程 打开 Hello World Icon.cpp 文件,对它进行一些修改: 首先,要加入 Resource 的头文件,注意加上注解。还有,加上回车会比较容易找到: #include //包含资源文件 #include "resource.h" LRESULT CALLBACK WndProc int WINAPI WinMain { …………………………………………. 找到前面提到的有关图标的 Windows API 函数,就是: …………………………………. wndclass. hInstance = hInstance ; wndclass. hIcon = LoadIcon ( NULL , IDI_APPLICATION) ; wndclass. hCursor = LoadCursor ( NULL , IDC_ARROW) ; …………………………………. 把它修改为如下代码: …………………………………… wndclass.hInstance = hInstance ; //指定图标 wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)) ; wndclass. hCursor = LoadCursor ( NULL , IDC_ARROW) ; ………………………………………. 其中 IDI_ICON1 是创建图标时 Vc 为它分配的一个标识;MAKEINTRESOURCE 是一个宏,不用 去了解太详细,毕竟这与本书的重点--游戏编程没有太大的关系,只要会用就可以了。 : 好,下面按 F5 键,编译运行程序,创建了一个窗口(见图 1-16) (HWND , UINT , WPARAM , LPARAM ) ; , int nCmdShow) ( HINSTANCE hInstance ,HINSTANCE hPrevInstance, LPSTR lpcmdLine 图 1-16 创建窗口 看出区别没有?没有!再仔细一点,在窗口的左上角。出现了新的图标。当然也可以不要, 但是这里就不说了,这与本书的游戏无关。所要实现的是下面这个效果,就是可执行文件(.EXE) Windows 下的 C/C++编程 文件的图标是自己设计的(见图 1-17) : 图 1-17 图标 试 好了,现在可以改变程序的图标了,那 么,也就可以开始为自己的游戏 设计一个自己喜欢的图标了,现在 2)控制鼠标 这里说所得控制鼠标仅仅是指控制鼠标在窗口中的形状,更高级的控制在后面的章节会讲 到。 在 Windows 中,可以改变鼠标的样式,Windows 提供了很多样式以供选择。但是,用户可能 会想在自己的程序中需要一个个性化的形状。下面,就一步步的来吧: 同样,它也属于一种资源,所以把它加入资源文件中。