Windows编程基础.pdf
《Windows编程基础.pdf》由会员分享,可在线阅读,更多相关《Windows编程基础.pdf(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 第第 1 章章 Windows 编程基础编程基础 学习目标学习目标 1、Windows 编程基本概念(掌握)2、Windows GDI 函数的使用(掌握)3、用消息机制处理用户交互过程(理解)背景知识背景知识 1、C基础 本章要点本章要点 1、Windows GDI 函数 2、Windows 消息机制 引言引言 Windows 是当今主流的操作系统,也是网络游戏主要的开发平台。不论是网络游戏客户端开发还是服务器端开发,都有很多成功的网络游戏作品运行于 Windows 操作系统上。虽然对于服务器端开发来讲,还有 Unix/Linux 以及其他种类的操作系统可以选择,但是相关技术知识相当繁杂,因
2、此本章中重点介绍 Windows 平台下的程序设计,所涉及到的若干 Windows 编程基础概念对于开发者针对DirectX程序设计和 WinSock 程序设计的理解和掌握是相当重要的。Windows 操作系统本身和其上的软件技术发展是相当迅速的,从早期的 Windows 3.1 直到目前的Windows XP 的各个版本,其功能愈加强大和完善。网络游戏客户端设计所关注的 DirectX 技术也在快速发展,当开发者对 DirectX 7.0 版本到 DirectX 9.0 版本,甚至即将推出的 DirectX 10.0 版本间的若干细微变化还应接不暇时,意在整合以 Windows、Xbox、W
3、indows CE 为代表的家用电脑、家用游戏机、移动设备这三种游戏平台的微软新一代“通用软件开发平台”XNA 也已经在如火如荼的宣传之中了,它的含义是 DirectX&Xbox,NextGeneration,Architecture。技术的发展如此迅猛,作为游戏开发者来说,意味着需要投入大量的时间和精力去跟踪学习新的游戏开发技术,这样虽然能够保证游戏的高效开发及技术先进性,但是新技术的学习曲线也是不容忽视的。开发者应该熟知 Windows 平台的底层开发和高级开发包之间的关系和区别,如果对 Windows 编 程基础还掌握得不是很充分很透彻,那么即使开发包、开发工具再先进,也不能保证开发者可
4、以顺利进行游戏开发。Windows 基础方式的编程早在 VC 1.5版本的时候就已经很明显了,那就是基于 Windows API 的 SDK 方式的编程,一种 C 风格的 API 编程。随后出现的微软 MFC 库、FCL 库可以理解为是对Windows API 的重新封装,一种 C+风格的面向对象的编程,从技术学习的角度来看,如果希望掌握Windows 编程的本质,值得深入研究的是 Windows 底层的 API,也就是 SDK 方式的 Windows 编程,而且 DirectX 的绝大多数版本及相关技术资料都是采用这种方式来进行开发的,因此虽然本书中的案例开发采用了 VC.Net 2003
5、的开发环境,但是本章在介绍 Windows 编程基础的时候,将重点介绍 Windows的 SDK 方式的开发、消息机制、相关概念及重要的 API 函数。API 是 Windows SDK 方式开发的基础,Windows 平台上运行的各类软件都可以用 Windows API 来实现。具体的开发方式非常类似于采用 C 语言的标准函数库的面向过程的开发,为程序实现一个入口函数 main,进而实现其他函数,在 main 函数中指定各类函数的调用关系及逻辑。Windows API 同样也是一个非常庞大的函数库,里面汇聚了 Windows 平台上的各种系统调用函数,可以实现 Windows 窗口绘制、网络
6、数据包收发、键盘鼠标的输入获取等等众多游戏设计所关注的功能。既然 API 函数如此庞大,我们的重点又是 Windows SDK 方式的开发,那么对它的学习肯定也不是一蹴而就的。开发者通常要配备 Windows API 大全、Windows 消息大全这样的参考手册,或者结合微软的 MSDN 来开发,原因很简单,几乎没有人能对如此大量的 Windows API 函数和这些函数的参数类型、参数个数、函数返回值、调用方式等熟记于心!本章只拣选对游戏开发比较重要的 Windows API 来介绍,由于开发目的及实现方式的不同会导致所采用的 API 也各不相同,所以这里的介绍可能不够全面,只能靠开发者不断
7、地熟悉及实践来扩大知识积累,这一点犹为重要。当然,在掌握了大量的 Windows API 函数之后,游戏开发者也可以考虑在开发环境上进行变通,比如不采用 VC.Net 2003 来开发,而采用诸如 Borland C+或者 Delphi 这样的开发环境来开发都是可行的,关键取决于游戏开发者的技术熟练程度。1.1 Windows 编程约定编程约定 1.1.1 Windows编程常见缩写编程常见缩写 API:Application Programing Interface,应用程序接口。SDK:Software Development Kit,软件开发包。MFC:Microsoft Foundat
8、ion Class,微软基础类库。MSDN:Microsoft Developer Network,微软开发者网络。GDI:Graphics Device Interface,图像设备接口。MDI:Multiple Documents Interface,多重文档界面。SDI:Simple Document Interface,单文档界面。1.1.2 Windows编程常见数据类型编程常见数据类型 类型定义 含义 BOOL 布尔型(逻辑型)变量(应为 TRUE 或 FALSE)BOOLEAN 布尔型(逻辑型)变量(应为 TRUE 或 FALSE)BYTE 字节(8 位)CCHAR Window
9、s 字符 CHAR Windows 字符 TCHAR 取决于预处理器的符号 UNICODE 是否定义 COLORREF RGB(红绿蓝)颜色值(32 位)CONST 在执行时其值保持不变的变量 DLGPROC 指向应用程序定义的对话框过程回调过程的指针 DWORD 双字(32 位)DWORDLONG 双双字(64 位)FARPROC 指向应用程序定义的指针 FLOAT 浮点型变量 GLOBALHANDLE 全局内存块句柄 HACCEL 加速键表句柄 HANDLE 对象句柄 HBITMAP 位图句柄 HBRUSH 画刷句柄 HDC 设备环境句柄 HFILE 文件句柄 HFONT 字体句柄 HGD
10、IOBJ GDI(图形设备接口)对象句柄 HGLOBAL 全局内存块句柄 HHOOK 钩子句柄 HICON 图标句柄 HINSTANCE 实例句柄 HLOCAL 本地内存句柄 HMENU 菜单句柄 HOOKPROC 指向应用程序定义的钩子的指针 HPALETTE 调色板句柄 HPEN 画笔句柄 HWND 窗口句柄 LOCALHAND 本地内存句柄 LONG 32 位无符号值 LONGLONG 64 位无符号值 LPARAM 32 位消息参数 LPCSTR 指向 Windows 常字符串(以空字符结束)的指针 LPSTR 指向 Windows 字符串(以空字符结束)的指针 LPVOID 指向任意
11、类型的指针 LRESULT 常规函数返回值 MSG Windows 消息 PROC 指向回调函数的指针 SHORT 短整型数 UCHAR 无符号 Windows 字符 UINT 无符号整数 ULONG 无符号长整型数(32 位)USHORT 无符号短整型数(16 位)VOID 任意类型 WINAPI FAR PASCAL 的等价声明方式 WNDPROC 指向在应用程序中定义的窗口过程的指针 WORD 无符号字(16 位)WPARAM 32 位消息参数,早期 Win3.x 中为 16 位 以上列表中包括了字符型、整型、浮点型、布尔型、指针型以及 Windows 应用程序特有的句柄型,表示指针型的
12、数据类型往往以 P 或 LP 作为前缀,而句柄型总是冠以 H。当然上面的列表并非全部,还有诸如CALLBACK回调函数的声明方式,WNDCLASS窗口类的声明方式等繁多的类型定义或宏定义。1.1.3 Windows编程命名规则编程命名规则 介绍了常见的 Windows 数据类型后,不得不提到著名的“匈牙利命名法”。1.属性部分:全局变量:g_ 常量:c_ 类成员变量:m_ 2.类型部分:指针:p 句柄:h 布尔型:b 浮点型:f 无符号:u 3.描述部分:初始化:Init 临时变量:Tmp 目的对象:Dst 源对象:Src 窗口:Wnd 了解这种命名规则对理解常见的 Windows 程序非常有
13、帮助,对于代码调试也用途很大,现在可以结合这种命名规则来理解下面的定义了:hWnd:h 表示句柄,Wnd 表示窗口。g_bFlag:g 表示全局变量,b 表示布尔型,Flag 表示状态标志。结合以上介绍的 Windows 编程常见数据类型,对不同类型的句柄进行理解记忆,在后续的 Windows程序开发中就会受益匪浅。下面我们结合各个项目来具体了解一下这些相关概念。1.2 Windows 编程编程基本基本概念概念 1.2.1 句柄句柄 几乎 Windows 编程涉及的很多内容都和句柄有关联。句柄是用来标识项目的,这些项目包括:窗口(window)资源(resource),包括图标(icon),光
14、标(cursor),菜单(menu),字符串(string)等。GDI 对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域(region),以及设备环境(device context)。模块(module)实例(instance)文件(file)内存块(block of memory)控件(control)字体(font)注:device context 通常译作设备上下文,这里为了理解方便称为“设备环境”。1.窗口“窗口”是 Windows 程序实现的基础,大多数 Windows 程序都是以窗
15、口的方式运行的。网络游戏客户端编程也要用 DirectX 在窗口基础上实现程序,而网络游戏服务器端编程中,诸如监测工具、GM工具等程序实现也常以窗口方式运行。在 Windows 开发中,可以通过设置参数来决定窗口类型,这样可以实现多样的窗口外观,比如有菜单栏的窗口、有状态栏的窗口、有滚动条的窗口等等。从技术角度上看,每个窗口都具有窗口句柄(HWND 类型的变量),在系统内可以通过窗口句柄定位具体的可见或不可见的窗口。每个窗口又对应着窗口类,同样的窗口类可以用来创建多个具有相同外观和相同特性的窗口,例如 Windows 的文件夹可以是相同外观,也可以同时具有相同的特性,可以使用滚动条 浏览文件等
16、等。2.资源“资源”的概念比较广泛,Windows 的视窗系统又实在是庞大而复杂。在 Windows 程序设计中,对话框、光标、图标、位图、菜单、快捷键、字符串、版本信息等诸多构成窗口的要素都是资源类型。在 VC 6.0 版本的界面中也提供了专门的 Tab 页来方便开发者对资源进行有效管理并能够将资源进行编译,存放在.rc 格式的文件中。每个资源都对应唯一的 ID 值,应用程序通过资源 ID 对资源进行定位。浅显的理解是资源在窗口程序开发中相对固定的窗口要素。实际在窗口程序开发中,不但要通过设计工具来制作、导入各种资源,还要对这些资源实现代码控制,比如对话框这种资源通常是要对用户的输入进行响应
17、的,具体能完成什么功能就要靠开发者具体实现。3.GDI 对象“GDI 对象”在游戏客户端开发中应用比较少,因为游戏界面的众多元素通常都以图像来实现,以突出游戏的画面风格。这里需要强调的就是设备环境,通常在 SDK 方式的开发中,都要涉及 HDC的数据类型,所有的与图形有关的调用将在 HDC 变量初始化后继续进行,所以简单地理解可以认为HDC 是图像显示设备的一种抽象,这样在进行绘图的时候就可以忽略计算机显卡的具体细节。4.模块“模块”在 Windows 编程中实际上就是对应着 DLL 编程。DLL(Dynamic Link Library,动态链接库)是在 Windows 系统中广泛采用的函数
18、封装方式。对应于 C 语言中常见的静态函数库.lib 在生成可执行文件时即参与链接的方式,.dll 可以在可执行文件运行时根据需要将动态链接库加载到内存以继续运行。这样的动态加载方式的优点显而易见,那就是可以大大地减少可执行文件的大小,对于有大量函数可以共用的程序非常有优势。比如,Windows 系统是很庞大的,可共用的函数众多。在系统层面上,早期 windows 版本中采用 user.dll、kernel.dll 和 gui.dll 作为核心的动态链接库,在应用层面上,windows提供网络连接的库为 ws2_32.dll,也是采用动态链接库实现的。5.实例“实例”也是一种重要的句柄,Win
19、dows 系统中创建的各个应用程序都对应着不同的实例句柄。Windows 是一种多用户操作系统,同样的应用程序可以启动多次。每次开启同样的应用程序时,创建的实例是不一样。这里需要注意的是实例句柄和窗口句柄的关系:如果应用程序可以开启窗口,那么一个应用程序可能开启多个窗口,也就是说同样的实例句柄可能关联着多个窗口句柄;如果相同的应用程序再次启动,同样开启了多个窗口,那么新启动的应用程序具有新的实例句柄以及和这个句柄对应的新的窗口句柄。6.文件“文件”句柄在 Windows 编程中实现数据永久存储时很重要。在 Windows 平台发展过程中的文件系统有 FAT、FAT32、NTFS。如果开发者在访
20、问一个文件的时候都要考虑到操作系统存储文件时的数 据组织方式,那么这无疑给开发者带来了很大的负担。因此 Windows API 中封装了与文件操作相关的大量函数,而这些函数的使用,都和文件句柄有关系。因此文件句柄也是重要的句柄类型。7.内存块“内存块”句柄与 Windows 操作系统在内存管理上的实现方式关系密切。在早期的计算机中通常可使用的内存和硬盘是严格区分的,并且内存管理上通常都采用特殊的寻址方式,非常不利于开发者操作内存。而在现代操作系统中,通常都使用了“页”式内存管理,而可寻的地址范围则更大。在 Windows系统中,应用程序可寻址的内存达到 4G,但实际上低 2G 内存是 Wind
21、ows 系统使用的,所以通常可以认为可寻址可使用的内存为 2G。当然,PC 中内存一般没有这么大,此时操作系统会利用硬盘空间“虚拟”出更多的内存供应用程序使用,但是硬盘数据的存取速度和内存数据的存取速度是无法比拟的,所以如果程序要大量使用虚拟出来的内存,那么程序本身的响应速度和系统性能都会下降。为了操作内存就必须使用内存块句柄。8.控件“控件”句柄也是经常使用的一种句柄。现代操作系统往往在软件的可重用性上重点实现。相关的 OLE 技术、ActiveX 技术代表了 Windows 平台上控件技术的发展。虽然在游戏程序开发当中很少采用已有的控件,但是对控件技术的掌握可以使得大量的常规程序开发工作变
22、得简单可以利用大量的控件资源快速地实现程序功能。9.字体“字体”句柄在设计界面信息交互时十分重要。不论是窗口应用开发还是游戏客户端图形图像设计,从用户使用的角度来讲,图形图像对信息传达的力度是远远不够的,面对计算机,用户获取的大量信息还是来自于文字信息。对于游戏客户端设计来说,使用字体句柄来指定所要选择的字体库、字型、字号,可以通过美观的字体来塑造表现力丰富的画面信息,实现玩家与游戏之间、玩家与玩家之间的信息交流。句柄的使用通常通过调用特定的 API 函数来进行,例如:/加载资源 ID 为 IDI_WINLOGO 的图标并返回 HICON 类型的句柄 HICON hIcon=LoadIcon(
23、NULL,IDI_WINLOGO);/加载 Windows 默认的箭头鼠标形状并返回 HCURSOR 类型的句柄 LoadCursor(NULL,IDC_ARROW);/取得 Windows 预定义的黑色刷子用来绘制区域并返回 HBRUSH 类型的句柄 HBRUSH hbrBackground=GetStockObject(BLACK_BRUSH);1.2.2 Windows消息机制简介消息机制简介 1.消息 Windows 是一个消息驱动的操作系统,因此理解 Windows 的消息机制非常重要。消息为应用程序和应用程序间、应用程序和操作系统间提供了信息传递的渠道。在早期的 16 位 Wind
24、ows 系统中,操作系统实现为协同式多任务系统,整个系统只有一个消息队列,所有应用程序都要访问这个消息队列以便检查是否有自己所关心的消息。在后来的 32 位 Windows 系统中,操作系统实现为抢占式多任务系统,系统中每个运行中的应用程序都有一个消息队列,系统不用等到应用程序完成消息处理就可以得到控制权。消息是由消息 ID(UINT)和两个消息参数(WPARAM,LPARAM)构成的。不论是用户和窗口的键盘鼠标交互还是窗口本身状态的改变,系统都会发送特定的消息到当前窗口,而每个窗口都有预先指定的消息处理函数(通常是 WndProc),在消息处理函数中会识别系统所发送的消息,根据消息 ID进行
25、具体处理。typedef struct tagMSG /消息结构体 HWND hwnd;/窗口句柄 UINT message;/消息的类型 WPARAM wParam;/消息的额外信息,含义由消息类型确定 LPARAM lParam;/消息的额外信息,含义由消息类型确定 DWORD time;/投递消息的时间 POINT pt;/投递消息时光标的位置 MSG;比如,当键盘被按下时,WM_KEYDOWN 消息发送到当前窗口,消息的 WPARAM 参数中包含了按键的字符信息;当鼠标左键被按下时,WM_LBUTTONDOWN 消息发送到当前窗口,消息的 LPARAM参数的低 16 位和高 16 位分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 编程 基础
限制150内