3D游戏编程入门(二)Windows编程基础概念
终于可以继续D3D的相关复习了.呼,这将长期而辛苦~希望我们能够一同努力下去.切入正题
###Windows简介
首先,我们必须了解Windows是什么一个东西,这么一问,想必大家都很容易回答:一个操作系统.恩,没错,那么它有什么特性呢?跟游戏制作相关有什么关系呢?我在这里为什么又会选择Windows平台来制作网络游戏呢?这要从它的基本特性来述说.
######Windows特性
Windows是基于图形界面的操作系统,它的特性就是其标准化的图形用户界面(GUI)。同时它又是一个多任务操作系统,允许用户在同一时刻运行多个应用程序或同一个应用程序的多个实例。它采用了与硬件无关的方式来处理视频显示、键盘、鼠标、打印机、串行口以及系统时钟。这些特性决定了Windows的成功,它现在做为世界上最主流的操作系统,也是网络游戏最主要的开发平台.我们需要使用它.
我们对Windows编程,那么我们需要了解它的API.
######WinAPI的重要性
或许有朋友会说,我们可以使用微软的MFC库和FCL库进行编程啊,那么我想告诉大家的是,Windows API的SDK方式编程更有利于我们去了解Windows的本质,MFC,FCL库均是对Windows API的一种高级封装而已,而且当我们使用DirectX时,我们将明白,DX的绝大多数版本和相关资料,均是使用WinAPI的方式来进行开发的.
API是Windows_SDK开发的基础,Win平台上的一切软件都可以使用WinAPI来实现,而对于我们的3D网络游戏制作来说,WinAPI的学习对于我们针对DirectX程序设计和WinSock程序设计的理解和掌握是相当重要的。
######部分编程简称
- API: Application Programing Interface 应用程序接口
- SDK: Software Development Kit 软件开发包
- MFC: Microsoft Founddation Class 微软基础类库
- MSDN: Microsoft Development Network 微软开发者网络
- GDI: Graphics Device Interface 图象设备接口
- MDI: Multiple Documents Interfaces 多重文档界面
- SDI: Simple Document Interface 单文档界面
######Windows编程常见类型
这些东西多是Windows内核已经宏定义好了的符号
- BOOL 布尔型变量
- BOOLEAN 布尔型变量
- BYTE 8位字节型
- CCHAR/CHAR Windows字符型
- COLORREF 32位RGB格式的颜色值
- CONST const常量
- DWORD 32位双字节
- DWORDLONG 64位双双字节
- DLGPROC 指向一个应用程序定义的对话框过程回调指针
- FLOAT 浮点型
- FARPROC 指向应用程序定义的指针
- HACCEL 加速键表句柄
- HANDLE 对象句柄
- HBITMAP 位图对象句柄
- HBRUSH 笔刷句柄
- HDC 设备上下文句柄
- HGDIOBJ 图形设备接口对象句柄
- HFILE 文件句柄
- HFONT 字体句柄
- HHOOK 钩子句柄
- HGLOBAL 全局内存块句柄
- HICON 图标句柄
- HINSTANCE 实例句柄
- HLOCAL 本地内存句柄
- HMENU 菜单句柄
- HOOKPROC 指向应用程序定义的钩子句柄
- HPALETTE 调色版句柄
- HPEN 画笔句柄
- HWND 窗口句柄
- LOCALHAND 本地内存句柄
- LONG 32位无符号值
- LONGLONG 64位无符号值
- LPARAM 32位消息参数
- LPCSTR 指向Windows常字符串的指针
- LPSTR 指向Windows字符串的指针
- LPVOID 指向任意类型的指针
- LRESULT 常用函数返回值
- MSG Windows消息
- PROC 指向回调函数的指针
- SHORT 短整型数
- UCHAR 无符号Windows字符
- UINT 无符号整型
- ULONG 无符号长整型32位
- USHORT 无符号短整型16位
- VOID 任意类型
- WINAPI 相当于FAR PASCAL
- WNDPROC 指向应用程序中定义的窗口的指针
- WORD 无符号字16位
- WPARAM 32位消息参数
呵呵,是不是看晕了,实际上,上列定义虽是从网上转载的,但均经过我整理,亲手打出,也的确花了一些时间,但仔细看的话,不难发现,其实这些是有迹可寻的,前面是”LP”的就是LongPiont,长指针类型的.而”H”开头的,大部分是Handle句柄类型的,“U”是Unsign无符号型,这样一下子就简化了很多吧~当然这些不是全部,还有CALLBACK回调函数的声明方式,WNDCLASS窗口类的声明方式.
######Windows命名规则
相信熟悉编程的朋友不会不知道著名的”匈牙利命名法”吧,这个全世界程序员遵循的编程规范部分如下
- 全局变量 g_
- 常量 c_
- 类成员变量 m_
- 指针 p
- 句柄 h
- 布尔型 b
- 浮点型 f
- 无符号 u
- 初始化函数 Init
- 临时变量 Tmp
- 目的对象 Dst
- 源对象 Src
- 窗口 Wnd
我们很必要来记住这些命名规则,他对于我们阅读代码用途很大,而规范的编程习惯是成为程序员的第一步!
例如,我们见到一个g_bFlag变量,我们很容易理解,它是全局的布尔型的状态标志变量.
###Windows编程部分概念精解
- 句柄
几乎所有的Windows编程都会涉及句柄,而实际上它就做一个标识的作用.你甚至可以将它理解成人的名字,当我们让”张三”做某事时,这个句柄就是”张三”,而”李四”是不会做出应答的.
- 窗口
Windows编程实现的基础就是窗口,大多数Win程序都是以窗口形式运行的,而我们即将开始的DX程序也必须以Win窗口上实现,它是一切的实现基础.必不可少.
- 资源
在Win编程中,窗口的图标,鼠标光标,菜单等都是资源的类型,在VC环境下,Tab页也专门为资源进行了有效的管理,它将资源进行编译存放在.rc格式文件中,我们可以用代码来控制何时何地调用哪个资源.
- 模块
在Win编程中,模块其实就是DLL编程.Dynamic Link Library动态链接库其实就是一种动态的函数库封装.对于我们频繁使用的函数库,我们可以将它封装到DLL文件中,动态的调用比原先静态的Lib库优点显而易见,极大的减少了应用文件大小.因为我们可以重复调用.
- 实例
Instance也是WIN编程中重要的句柄.我们每使用一个应用程序,我们都会获得一个对应的实例.然而实例和窗口句柄是不同的.我们这里可以举例,当我们一个程序开启多个窗口时,我们将仅仅一个实例,而有许多的窗口句柄,但值得注意的是,实例并不是锁定某个程序的,当我们的程序关闭,实例将释放消失,当我们再次启动该程序时,将获得一个新的实例,而与原先的实例完全不同,当然这个实例对应的窗口句柄也将更新.
- 内存块
我们必须清楚,在早期计算机中,内存和硬盘是严格区分的,内存拥有着独特的寻址方式,然而这并不利于我们的内存操作.所以现在通常使用”页”式内存管理。这将更加符合我们硬盘的寻址方式.所以当现在我们的计算机内存不足时候,计算机将会将一部分的硬盘虚拟的做为内存供给我们应用程序来使用,也就是”虚拟内存”.然而硬盘数据读取速率和内存的读取速率是无法比拟的,所以当我们内存不足而使用虚拟内存时,程序的运行速度将会大大降低..我们进行编程设计时应当合理使用内存,避免使用虚拟内存.