VC++ Win32 API 编程简介及游戏开发
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.4 句柄
句柄,顾名思义,指的是一个windows对象 的把柄。 Windows中的句柄都是32位的指针变量,用 来指向某个windows对象所占据的内存区。 句柄的使用,极大地方便了Windows管理其 内存中的各种windows对象。
常用句柄类型及其说明
句柄
HWND HBITMAP HICON HMENU HFILE HINSTANCE HGLOBAL
WinMain()函数
第一个参数hInstance,是标识该应用程序当前实 例的句柄。 第二个参数是hPrevInstance,它是用来标识该应 用程序的前一个实例的句柄。 第三个参数是lpCmdLine,是指向应用程序命令行 参数字符串的指针。 最后一个参数是nCmdShow,是一个用来指定窗口 显示方式的整数。这个整数值可以是SW_SHOW、 SW_HIDE、SW_SHOWMAXIMIZED、 SW_SHOWMINIMIZED等。
2.4 windows应用程序的常用数据类型
数据类型 WORD LONG DWORD HANDLE UINT BOOL LPTSTR LPCTSTR 说 明 16 位无符号整数 32 位有符号整数 32 位无符号整数 句柄 32 位无符号整数 布尔值 指向字符串的 32 位指针 指向字符串常量的 32 位指针
是
程序结束,关闭窗口
2.2 入口函数WinMain()
WinMain()函数类似C语言中的Main函数,是 Win32应用程序入口函数。 WinMain()函数主要完成创建主窗口,并产生 和处理消息循环。
WinMain()函数
因为windows是多任务系统,所以同一应用程序的多个 窗口Байду номын сангаас能会同时存在。 windows系统对每个窗口的执行称为一个实例,用一个 实例句柄来唯一标识。 WinMain()函数与DOS程序的main()函数起同样的作用, 有一点不同的是,WinMain()函数必须带有四个参数,它 们是系统传递给它的。 WinMain()函数的原型如下: int PASCAL WinMain( HINSTANCE hInstance, //当前 实例句柄 HINSTANCE hPrevInstance, //前一个实例句柄 LPSTR lpCmdLine, //命令行字符 int nCmdShow) //窗口显示方式
2.3 窗口函数WndProc()
窗口函数WndProc()就是Windows应用程序的消息 处理程序。 窗口函数WndProc()定义了应用程序对接收到的不同 消息的响应,包含了对各种可能接收到的消息的处理 过程。 WndProc函数由一个或多个switch语句组成。每一 条case语句对应一种消息,当应用程序接收到一个 消息时,相应的case语句被激活并执行相应的响应 程序模块。 窗口消息处理程序不予处理的所有消息被传给名为 DefWindowProc的Windows函数进行默认处理。
1.鼠标消息,主要有: WM_LBUTTONDOWN:产生单击鼠标左键的消息。 WM_LBUTTONUP:放开鼠标左键时产生的消息。 …… 2.键盘消息,主要有: WM_KEYDOWN:按下一个系统键时产生的消息。 WM_KEYUP:放开一个系统键时产生的消息。 …… 3.窗口消息,主要有: WM_CREATE:窗口创建时,由CreateWindows函数 发出的消息。 WM_CLOSE:关闭窗口时产生的消息。 WM_QUIT:退出应用程序时,由PostQuitMessage函 数发出消息。 ……
1.1 Windows API编程基础
Windows编程的方法主要有两种方法:
传统编写法:利用API函数。 交互式方法:利用MFC类库。
为使程序员编写具有Windows风格的应用程序, Windows提供了一个应用程序编程接口(Application Programming Interface,简称API),它是Windows 系统与Windows应用程序间的标准程序接口。 上千个API函数包含了各种窗口类和系统资源。 API可以为应用程序提供windows系统特殊函数及数 据结构。 windows应用程序可以利用大量API函数调用系统功 能。
消息处理函数WndProc的大致结构
LRESULT CALLBACK WndProc(HWND hMainwnd, UINT message, WPARAM wParam, LPARAM lParam) //窗口函数的定义 { switch( message ) { case WM_KEYDOWN://击键消息 { …… ; break; } case ……: { ……; break; } …… case WM_DESTROY://关闭应用程序窗口时发出的消息 { PostQuitMessage(0);//发出WM_QUIT消息,结束应用程序 return 0; } default : break; } //调用缺省消息处理过程 return DefWindowProc(hMainwnd, message, wParam, lParam); }
ShowWindows()函数:应用程序通过调用ShowWindows() 函数在屏幕上显示窗口。 UpdateWindows()函数:显示窗口后,应用程序调用 UpdateWindow更新并绘制用户区,并发出WM_PAINT消 息。
消息循环
Windows为当前执行的每个Windows程序维护一个[消息队 列]。 在发生输入事件之后,Windows将事件转换为一个[消息]并 将消息放入程序的[消息队列]中。 程序通过执行一块称之为[消息循环]的程序代码从消息队列 中取出消息。 以下是WinMain()函数中消息循环的代码: //消息循环以调用GetMessage()开始,它从消息队列中取出 //一个消息 while (GetMessage (&msg, NULL, 0, 0)) { //将消息msg结构传给Windows,进行一些键盘转换。 TranslateMessage (&msg) ; //将该消息发送给窗口消息处理程序进行处理。 DispatchMessage (&msg) ; }
2.5 API编程实例
所有的Windows应用程序中,都有一个程序初始化的过程。 下面以一个实现最简单功能的程序WinApiDemo为例,说 明Windows程序的基本框架。操作步骤如下:
VC++ win32 API 游戏开发
VC++ win32 API 游戏开发
1.Windows 编程 2.Windows应用程序的组成与编程 3. 游戏实现原理与Window GDI绘图 4.游戏实例的剖析
1.Windows编程
1.1 Windows API编程基础 1.2 窗口 1.3 事件驱动 1.4 句柄 1.5 消息 1.6 Windows应用程序的常用消息
WinMain()函数的大致结构
int PASCAL WinMain(…… ) { //①定义窗口类: WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; …… 十个字段 wndclass.lpszClassName=”Lei”; //②注册窗口类: RegisterClass(&wndclass); //③创建窗口: HWND hwnd; hwnd=CreateWindow(); //④显示及更新窗口: ShowWindow(); UpdateWindow(); //⑤消息循环: MSG msg; While(GetMessage(&msg,NULL,0,0)) { TranlateMessage(&msg); DispatchMessage(&msg) } return msg.wParam; }
MFC
MFC, Microsoft Foundation Class Library, 微软基础类库,约有200个类。 MFC封装了大部分API函数,并提供了一个应 用程序框架,简化了和标准了windows程序 设计。 但Windows API编程方法始终是windows编 程的基础。
1.2 窗口
2.Windows应用程序的组成与编程
2.1 典型的Windows程序结构 2.2 入口函数WinMain() 2.3 窗口函数WinProc() 2.4 windows应用程序的常用数据类型 2.5 API编程实例
2.1 典型的Windows程序结构
Windows应用程序的主体由以下两个函数完成:
WinMain()函数负责建立窗口和建立消息循环。 WinProc()函数负责消息的处理。
2.1 典型的Windows程序结构
程序开始执行 程序打开窗口
是否有消息?
WinMain()函数负责
否
WinProc()函数负责
是 否 退出消息? 是
应用程序 处理消息? 否 Windows默认处理
处理消息
说明
窗口句柄 位图句柄 图标句柄 菜单句柄 文件句柄
句柄
HDC HCURSOR HFONT HPEN HBRUSH
说明
设备环境句柄 光标句柄 字体句柄 画笔句柄 画刷句柄 局部内存对象 句柄
当前实例句柄 HLOCAL 全局内存对象 句柄
1.5 消息
消息是描述事件发生的信息。 Windows应用程序通过消息进行信息交换。 在Windows中,消息用结构体MSG表示,其结构如下: Typedef struct tagMSG { HWND hwnd; //窗口句柄 UNIT message; //消息号。 WPARAM wParam;//用于提供消息的附加消息。 LPARAM lParam;//用于提供消息的附加消息。 DWORD time;//指定消息送至队列的时间 POINT pt; //指定消息发送时屏幕光标的位置 }MSG;
编写一个Windows应用程序首先应创建一个 或多个窗口,而后应用程序的运行过程即是窗 口内部、窗口与窗口之间、窗口与系统之间进 行数据处理与数据交换的过程。
1.3 事件驱动
Windows程序设计是针对事件或消息的,它 的执行顺序取决于事件发生的顺序。 在Windows环境下,应用程序启动后,系统 等待用户在图形用户界面内的输入选择,如鼠 标按键、键盘按键、窗口被创建、关闭、改变 大小、移动等,对系统来说,这都是事件,都 会产生相应的windows消息。 事件驱动编程方法对于编写交互式程序很有用 处,它避免了死板的操作模式。
VC++中存在几种系统定义的消息分类,不同的 前缀符号经常用于识别消息的分类,如下表所示: 前缀 WM BM 消息分类 表示窗口消息 表示按钮控制消息
CB
DM EM LB SBM
表示组合框控制消息
表示默认下压式按钮控制消息 表示编辑控制消息 表示列表框控制消息 表示滚动条控制消息
1.6 Windows应用程序的常用消息
WinMain()函数主要由2部分组成:
窗口初始化 消息循环
窗口初始化包括以下主要步骤:
定义窗口类: 通过给窗口类数据结构WINDCLASS赋值, 设置窗口类的各种属性。如窗口边框、窗口标题栏文字、 窗口大小和位置、鼠标、背景色等。 注册窗口类: Win系统本身提供部分预定义的窗口类,程 序员也可以自定义窗口类。窗口类必须先注册后使用。窗 口类的注册由函数RegisterClass()实现。 创建窗口实例: 创建窗口类的实例由CreateWindows()函 数实现。 窗口显示: 窗口类的显示是由ShowWindows()函数和 UpdateWindows()函数实现的。