网络游戏开发语言基础 ——Windows程序设计
第1章 Windows编程基础 1.1 Windows编程约定 Windows基础方式的编程早在VC 1.5版本的时候就已经很明显了,那就是基于Windows API的SDK方式的编程,一种C风格的API编程。 第1章 Windows编程基础
第1章 Windows编程基础 1.1 Windows编程约定 1.1.1 常见缩写 API 1.1.1 常见缩写 API Application Programming Interface,应用程序编程接口。 SDK Software Development Kit,软件开发包。 MFC 第1章 Windows编程基础 Microsoft Foundation Class,微软基础类库。
第1章 Windows编程基础 1.1 Windows编程约定 1.1.1 常见缩写 MSDN 1.1.1 常见缩写 MSDN Microsoft Developer Network,微软开发者网络。 DC Device Contexts,设备环境(也译为设备上下文)。 GDI 第1章 Windows编程基础 Graphics Device Interface,图像设备接口。
第1章 Windows编程基础 1.1 Windows编程约定 1.1.1 常见缩写 MDI SDI 1.1.1 常见缩写 MDI SDI Multiple Documents Interface,多重文档界面。 Simple Document Interface,单文档界面。 DLL Dynamic Link Library,动态链接库。 ATL 第1章 Windows编程基础 Active Template Library,活动模板库。
第1章 Windows编程基础 1.1 Windows编程约定 1.1.2 Windows常见数据类型 Windows常见数据类型与C语言数据类型有很多相似之处。 类型定义 含义 BOOL 布尔型(逻辑型)变量(取值为TRUE或FALSE) BYTE 字节(8位) CCHAR Windows字符 CHAR TCHAR 取决于预处理器的符号UNICODE是否定义 CONST 在执行时其值保持不变的变量 DWORD 双字(32位) FLOAT 浮点型变量 HANDLE 对象句柄 HBITMAP 位图句柄 HBRUSH 画刷句柄 HDC 设备环境句柄 HFILE 文件句柄 HFONT 字体句柄 HGLOBAL 全局内存块句柄 HHOOK 钩子句柄 HICON 图标句柄 HINSTANCE 实例句柄 HPEN 画笔句柄 HWND 窗口句柄 LONG 32位无符号值 第1章 Windows编程基础
第1章 Windows编程基础 1.1 Windows编程约定 1.1.2 Windows常见数据类型 实际上,大部分的Windows数据类型都是来自C语言数据类型。 数据定义的头文件为windef.h。 typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; 第1章 Windows编程基础 大部分的Windows数据类型都全是由大写字母组成
第1章 Windows编程基础 1.1 Windows编程约定 1.1.3 Windows编程命名规则 匈牙利命名法由前缀、描述、类型3个部分组成 前缀 使用前缀 变量属性 g_ 全局变量 c_ 常量 m_ 类成员变量 第1章 Windows编程基础
int分别用作x长度和y长度;C代表「计数器」 1.1 Windows编程约定 1.1.3 Windows编程命名规则 使用前缀 数据型态 c char或WCHAR或TCHAR by BYTE (无正负号字符) n short i int x, y int分别用作x坐标和y坐标 cx, cy int分别用作x长度和y长度;C代表「计数器」 b或f BOOL (int);f代表「旗标」 w WORD (无正负号短整数) l LONG (长整数) dw DWORD (无正负号长整数) fn function(函数) s string(字符串) sz 以字节值0结尾的字符串 h 句柄 p 指标 类型 第1章 Windows编程基础
第1章 Windows编程基础 1.1 Windows编程约定 1.1.3 Windows编程命名规则 描述前缀 使用前缀 描述内容 Init 初始化 Tmp 临时变量 Dst 目的对象 Src 源对象 Wnd 窗口 第1章 Windows编程基础
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.1 句柄 1.2.1 句柄 句柄对系统来说就是一个指针,系统可以通过句柄得到相应的数据,但它对编程者来说更像是一个标识号,一个全局ID,编程者通过这个标识号向系统发出相应操作请求,由系统内部调用相应资源进行操作。 #ifdef STRICT typedef void *HANDLE; #else typedef PVOID HANDLE; #endif 第1章 Windows编程基础 句柄本质上就是一个空指针,可以指向任何它想指的数据。
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.1 句柄 在windows中句柄是用来标识资源的。 窗口 1.2.1 句柄 在windows中句柄是用来标识资源的。 窗口 “窗口”是Windows程序实现的基础,大多数Windows程序都是以窗口的方式运行的。 资源 第1章 Windows编程基础 “资源”的概念比较广泛,在Windows程序设计中,对话框、光标、图标、位图、菜单、快捷键、字符串、版本信息等诸多构成窗口的要素都是资源类型。
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.1 句柄 在windows中句柄是用来标识资源的。 GDI对象 1.2.1 句柄 在windows中句柄是用来标识资源的。 GDI对象 “GDI对象”是主要用于实现进行图形用户界面的对象。 模块 “模块”在Windows编程中实际上就是对应着DLL编程。 实例 第1章 Windows编程基础 Windows系统中创建的各个应用程序都对应着不同的实例句柄。
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.1 句柄 在windows中句柄是用来标识资源的。 文件 1.2.1 句柄 在windows中句柄是用来标识资源的。 文件 “文件”句柄在Windows编程中实现数据永久存储时很重要。 在Windows平台发展过程中的文件系统有FAT、FAT32、NTFS。 内存块 第1章 Windows编程基础 “内存块”句柄与Windows操作系统在内存管理上的实现方式关系密切。 现代操作系统中,通常都使用了“页”式内存管理。
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.1 句柄 在windows中句柄是用来标识资源的。 控件 1.2.1 句柄 在windows中句柄是用来标识资源的。 控件 Windows控件是用户为应用程序提供必要信息的用户界面,也是应用程序为用户提供丰富信息的界面。 字体 第1章 Windows编程基础 “字体”句柄在设计界面信息交互时十分重要。 用字体句柄来指定所要选择的字体库、字型、字号。
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.2 Windows消息机制简介 1. 消息的概念 1. 消息的概念 Windows是一个消息驱动的操作系统。 消息为应用程序和应用程序间、应用程序和操作系统间提供了信息传递的渠道。 在早期的16位Windows系统中,操作系统实现为协同式多任务系统,整个系统只有一个消息队列,所有应用程序都要访问这个消息队列以便检查是否有自己所关心的消息。 在后来的32位Windows 系统中,操作系统实现为抢占式多任务系统,系统中每个运行中的应用程序都有一个消息队列,系统不用等到应用程序完成消息处理就可以得到控制权。 第1章 Windows编程基础
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.2 Windows消息机制简介 1. 消息的概念 1. 消息的概念 消息是由消息ID(UINT)和两个消息参数(WPARAM,LPARAM)构成的。 每个窗口都有预先指定的消息处理函数(通常是WndProc),在消息处理函数中会识别系统所发送的消息,根据消息ID进行具体处理。 在Windows中定义的消息结构体为: typedef struct tagMSG { //消息结构体 HWND hwnd; //窗口句柄 UINT message; //消息的类型 WPARAM wParam; //消息的额外信息,含义由消息类型确定 LPARAM lParam; //消息的额外信息,含义由消息类型确定 DWORD time; //投递消息的时间 POINT pt; //投递消息时光标的位置 } MSG; 第1章 Windows编程基础
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.2 Windows消息机制简介 1. 消息的概念 1. 消息的概念 Windows中用宏定义的方式预定义了系统消息。 消息名称 消息含义 WM_CREATE 应用程序创建一个窗口 WM_DESTROY 一个窗口被销毁 WM_MOVE 移动一个窗口 WM_SIZE 改变一个窗口的大小 WM_QUERYENDSESSION 当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT 用来结束程序运行或当程序调用postquitmessage函数 WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口 WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色 WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连 WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联 WM_QUERYDRAGICON 此消息发送给最小化窗口 WM_KEYDOWN 按下一个键 WM_KEYUP 释放一个键 第1章 Windows编程基础
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.2 Windows消息机制简介 1. 消息的概念 1. 消息的概念 开发者可以自定义消息。 #define WM_USERMESSAGE WM_USER+1 注意,在定义消息时,要避免占用系统消息,能够使用的消息应该是在WM_USER之后 第1章 Windows编程基础
第1章 Windows编程基础 1.2 Windows编程基本概念 1.2.2 Windows消息机制简介 2. 消息循环 2. 消息循环 Windows系统中运行的每个应用程序都拥有自己的消息队列,每个应用程序都通过while循环不停地获取消息。 当发现应用程序本身关心的消息时就通过swtich语句来分别进行处理,否则就让应用处于空闲状态。 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 典型的SDK程序结构 头文件需要包含windows.h 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 消息处理函数 WndProc函数负责处理窗口消息。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd,msg,wParam,lParam); } 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 程序入口 _tWinMain主函数是整个应用程序的入口。 int WINAPI _tWinMain( HINSTANCE hInstance,HINSTANCE, LPTSTR lpCmdLine,int nCmdShow) { ......//注册窗口类 ...... //创建主窗口 ...... //显示并更新主窗口 ...... // 进入消息循环 ...... //程序退出 } 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 窗口类注册 WNDCLASSEX类型的变量wcex是个很典型的结构体变量,它的分量中存储着有关窗口类的各个参数 typedef struct tagWNDCLASSEXW { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; } HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; } 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 创建窗口 实际窗口的创建通过CreateWindow函数来完成。 hWnd=CreateWindow(lpszClassName, //创建窗口,窗口类名 lpszTitle, //窗口实例的标题名 WS_OVERLAPPEDWINDOW, //窗口的风格 CW_USEDEFAULT,CW_USEDEFAULT, //窗口左上角坐标为缺省值 CW_USEDEFAULT,CW_USEDEFAULT, //窗口的高度和宽度为缺省值 NULL, //此窗口没有父窗口 NULL, //此窗口没有主菜单 hInstance, //应用程序当前句柄 NULL); //不使用该值 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 窗口显示 窗口创建成功后,需要用如下代码显示窗口。 ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 消息循环 消息循环使用GetMessage函数获取消息,还可以使用PeekMessage函数 MSG msg; if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 消息循环 PeekMessage函数原型如下 BOOL PeekMessage( LPMSG lpMsg, // 消息结构指针 HWND hWnd, // 窗口句柄 UINT wMsgFilterMin, // 第一个消息 UINT wMsgFilterMax, // 最后一个消息 UINT wRemoveMsg // 消息移除标志,是否移除消息 ); 第1章 Windows编程基础 PeekMessage函数在没有消息时也立刻返回 GetMessage函数在等到消息时才返回。
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 发送消息 应用程序还要在特定时机主动发送消息,有两种方式可以发送消息。 BOOL PostMessage( HWND hWnd, // 目标窗口句柄 UINT Msg, // 要发送的消息 WPARAM wParam, // 消息参数 LPARAM lParam //消息参数 ); 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 发送消息 应用程序还要在特定时机主动发送消息,有两种方式可以发送消息。 LRESULT SendMessage( HWND hWnd, //目标窗口句柄 UINT Msg, //要发送的消息 WPARAM wParam, //消息参数 LPARAM lParam //消息参数 ); 第1章 Windows编程基础
第1章 Windows编程基础 1.3 Windows SDK典型的程序结构 1.3.1 典型的SDK程序 2. 对于SDK程序结构的分析 发送消息 PostMessage()被经常用来向队列中加入消息,如果调用成功则返回TRUE,否则返回FALSE。它只是简单的把消息加入到队列中,然后返回。多数情况下,调用它将返回TRUE; SendMessage()则有些不同,它并不是把消息加入到队列里,而是直接翻译消息和调用消息处理,直到消息处理完成后才返回。所以,SendMessage()比PostMessage()有更高的实时性。 第1章 Windows编程基础