《VC++ Win32 API 编程简介及游戏开发.ppt》由会员分享,可在线阅读,更多相关《VC++ Win32 API 编程简介及游戏开发.ppt(74页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VC+win32 API 游戏开发游戏开发VC+win32 API 游戏开发游戏开发l1.Windows 编程编程l2.Windows应用程序的组成与编程应用程序的组成与编程l3.游戏实现原理与游戏实现原理与Window GDI绘图绘图l4.游戏实例的剖析游戏实例的剖析1.Windows编程编程l1.1 Windows API编程基础编程基础l1.2 窗口窗口l1.3 事件驱动事件驱动l1.4 句柄句柄l1.5 消息消息l1.6 Windows应用程序的常用消息应用程序的常用消息1.1 Windows API编程基础编程基础lWindows编程的方法主要有两种方法:编程的方法主要有两种方法:l
2、传统编写法:利用传统编写法:利用API函数。函数。l交互式方法:利用交互式方法:利用MFC类库。类库。l为使程序员编写具有为使程序员编写具有Windows风格的应用程序,风格的应用程序,Windows提供了一个应用程序编程接口提供了一个应用程序编程接口(Application Programming Interface,简称,简称API),它是,它是Windows系统与系统与Windows应用程序间的标准程序接口。应用程序间的标准程序接口。l上千个上千个API函数包含了各种窗口类和系统资源。函数包含了各种窗口类和系统资源。lAPI可以为应用程序提供可以为应用程序提供windows系统特殊函数及
3、数系统特殊函数及数据结构。据结构。lwindows应用程序可以利用大量应用程序可以利用大量API函数调用系统功函数调用系统功能。能。MFClMFC,Microsoft Foundation Class Library,微软基础类库,约有,微软基础类库,约有200个类。个类。lMFC封装了大部分封装了大部分API函数,并提供了一个应函数,并提供了一个应用程序框架,简化了和标准了用程序框架,简化了和标准了windows程序设程序设计。计。l但但Windows API编程方法始终是编程方法始终是windows编编程的基础。程的基础。1.2 窗口窗口l编写一个编写一个Windows应用程序首先应创建一
4、个应用程序首先应创建一个或多个窗口,而后应用程序的运行过程即是窗或多个窗口,而后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。行数据处理与数据交换的过程。1.3 事件驱动事件驱动lWindows程序设计是针对事件或消息的,它程序设计是针对事件或消息的,它的执行顺序取决于事件发生的顺序。的执行顺序取决于事件发生的顺序。l在在Windows环境下,应用程序启动后,系统环境下,应用程序启动后,系统等待用户在图形用户界面内的输入选择,如鼠等待用户在图形用户界面内的输入选择,如鼠标按键、键盘按键、窗口被创建、关闭、改变
5、标按键、键盘按键、窗口被创建、关闭、改变大小、移动等,对系统来说,这都是事件,都大小、移动等,对系统来说,这都是事件,都会产生相应的会产生相应的windows消息。消息。l事件驱动编程方法对于编写交互式程序很有用事件驱动编程方法对于编写交互式程序很有用处,它避免了死板的操作模式。处,它避免了死板的操作模式。1.4 句柄句柄l句柄,顾名思义,指的是一个句柄,顾名思义,指的是一个windows对象的对象的把柄。把柄。lWindows中的句柄都是中的句柄都是32位的指针变量,用位的指针变量,用来指向某个来指向某个windows对象所占据的内存区。对象所占据的内存区。l句柄的使用,极大地方便了句柄的使
6、用,极大地方便了Windows管理其管理其内存中的各种内存中的各种windows对象。对象。常用句柄类型及其说明常用句柄类型及其说明句柄句柄说明说明句柄句柄说明说明HWND窗口句柄窗口句柄HDC设备环境句柄设备环境句柄HBITMAP位图句柄位图句柄HCURSOR光标句柄光标句柄HICON图标句柄图标句柄HFONT字体句柄字体句柄HMENU菜单句柄菜单句柄HPEN画笔句柄画笔句柄HFILE文件句柄文件句柄HBRUSH画刷句柄画刷句柄HINSTANCE当前实例句柄当前实例句柄 HLOCAL局部内存对象局部内存对象句柄句柄HGLOBAL全局内存对象全局内存对象句柄句柄1.5 消息消息l消息是描述事件
7、发生的信息。消息是描述事件发生的信息。lWindows应用程序通过消息进行信息交换。应用程序通过消息进行信息交换。l在在Windows中,消息用结构体中,消息用结构体MSG表示,其结构如下:表示,其结构如下:lTypedef struct tagMSGl HWND hwnd;/窗口句柄窗口句柄l UNIT message;/消息号。消息号。l WPARAM wParam;/用于提供消息的附加消息。用于提供消息的附加消息。l LPARAM lParam;/用于提供消息的附加消息。用于提供消息的附加消息。l DWORD time;/指定消息送至队列的时间指定消息送至队列的时间l POINT pt;
8、/指定消息发送时屏幕光标的位置指定消息发送时屏幕光标的位置lMSG;VC+中存在几种系统定义的消息分类,不同的中存在几种系统定义的消息分类,不同的前缀符号经常用于识别消息的分类,如下表所示:前缀符号经常用于识别消息的分类,如下表所示:前缀前缀消息分类消息分类WM表示窗口消息表示窗口消息BM表示按钮控制消息表示按钮控制消息CB表示组合框控制消息表示组合框控制消息DM表示默认下压式按钮控制消息表示默认下压式按钮控制消息EM表示编辑控制消息表示编辑控制消息LB表示列表框控制消息表示列表框控制消息SBM表示滚动条控制消息表示滚动条控制消息1.6 Windows应用程序的常用消息应用程序的常用消息l1.
9、鼠标消息,主要有:鼠标消息,主要有:lWM_LBUTTONDOWN:产生单击鼠标左键的消息。产生单击鼠标左键的消息。lWM_LBUTTONUP:放开鼠标左键时产生的消息。放开鼠标左键时产生的消息。ll2.键盘消息,主要有:键盘消息,主要有:lWM_KEYDOWN:按下一个系统键时产生的消息。按下一个系统键时产生的消息。lWM_KEYUP:放开一个系统键时产生的消息。放开一个系统键时产生的消息。ll3.窗口消息,主要有:窗口消息,主要有:lWM_CREATE:窗口创建时,由窗口创建时,由CreateWindows函数函数发出的消息。发出的消息。lWM_CLOSE:关闭窗口时产生的消息。关闭窗口时
10、产生的消息。lWM_QUIT:退出应用程序时,由退出应用程序时,由PostQuitMessage函函数发出消息。数发出消息。l2.Windows应用程序的组成与编程应用程序的组成与编程l2.1 典型的典型的Windows程序结构程序结构l2.2 入口函数入口函数WinMain()l2.3 窗口函数窗口函数WinProc()l2.4 windows应用程序的常用数据类型应用程序的常用数据类型l2.5 API编程实例编程实例2.1 典型的典型的Windows程序结构程序结构lWindows应用程序的主体由以下两个函数完成:应用程序的主体由以下两个函数完成:lWinMain()函数负责建立窗口和建立
11、消息循环。函数负责建立窗口和建立消息循环。lWinProc()函数负责消息的处理。函数负责消息的处理。2.1 典型的典型的Windows程序结构程序结构WinMain()函数负责函数负责程序开始执行程序开始执行WinProc()函数负责函数负责程序打开窗口程序打开窗口处理消息处理消息程序结束,关闭窗口程序结束,关闭窗口Windows默认处理默认处理应用程序应用程序处理消息处理消息?退出消息退出消息?是是是是否否否否是否有消息?是否有消息?是是否否2.2 入口函数入口函数WinMain()lWinMain()函数类似函数类似C语言中的语言中的Main函数,是函数,是Win32应用程序入口函数。应
12、用程序入口函数。lWinMain()函数主要完成创建主窗口,并产生函数主要完成创建主窗口,并产生和处理消息循环。和处理消息循环。WinMain()函数函数 l因为因为windows是多任务系统,所以同一应用程序的多个窗是多任务系统,所以同一应用程序的多个窗口可能会同时存在。口可能会同时存在。lwindows系统对每个窗口的执行称为一个实例,用一个实系统对每个窗口的执行称为一个实例,用一个实例句柄来唯一标识。例句柄来唯一标识。lWinMain()函数与函数与DOS程序的程序的main()函数起同样的作用,函数起同样的作用,有一点不同的是,有一点不同的是,WinMain()函数必须带有四个参数,它
13、函数必须带有四个参数,它们是系统传递给它的。们是系统传递给它的。lWinMain()函数的原型如下:函数的原型如下:lint PASCAL WinMain(HINSTANCE hInstance,/当前当前实例句柄实例句柄lHINSTANCE hPrevInstance,/前一个实例句柄前一个实例句柄lLPSTR lpCmdLine,/命令行字符命令行字符lint nCmdShow)/窗口显示方式窗口显示方式WinMain()函数函数l第一个参数第一个参数hInstance,是标识该应用程序当前实,是标识该应用程序当前实例的句柄。例的句柄。l第二个参数是第二个参数是hPrevInstance,
14、它是用来标识该应,它是用来标识该应用程序的前一个实例的句柄。用程序的前一个实例的句柄。l第三个参数是第三个参数是lpCmdLine,是指向应用程序命令行,是指向应用程序命令行参数字符串的指针。参数字符串的指针。l最后一个参数是最后一个参数是nCmdShow,是一个用来指定窗口,是一个用来指定窗口显示方式的整数。这个整数值可以是显示方式的整数。这个整数值可以是SW_SHOW、SW_HIDE、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED等。等。lWinMain()函数主要由函数主要由2部分组成:部分组成:l窗口初始化窗口初始化l消息循环消息循环窗口初始化包括以下主要步骤:窗口
15、初始化包括以下主要步骤:l定义窗口类定义窗口类:通过给窗口类数据结构通过给窗口类数据结构WINDCLASS赋值,赋值,设置窗口类的各种属性。如窗口边框、窗口标题栏文字、设置窗口类的各种属性。如窗口边框、窗口标题栏文字、窗口大小和位置、鼠标、背景色等。窗口大小和位置、鼠标、背景色等。l注册窗口类注册窗口类:Win系统本身提供部分预定义的窗口类,程系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类。窗口类必须先注册后使用。窗序员也可以自定义窗口类。窗口类必须先注册后使用。窗口类的注册由函数口类的注册由函数RegisterClass()实现。实现。l创建窗口实例创建窗口实例:创建窗口类的实例由
16、创建窗口类的实例由CreateWindows()函函数实现。数实现。l窗口显示窗口显示:窗口类的显示是由窗口类的显示是由ShowWindows()函数和函数和UpdateWindows()函数实现的。函数实现的。lShowWindows()函数:应用程序通过调用函数:应用程序通过调用ShowWindows()函数在屏幕上显示窗口。函数在屏幕上显示窗口。lUpdateWindows()函数:显示窗口后,应用程序调用函数:显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出更新并绘制用户区,并发出WM_PAINT消消息。息。消息循环消息循环 lWindows为当前执行的每个为当
17、前执行的每个Windows程序维护一个程序维护一个消息队消息队列列。l在发生输入事件之后,在发生输入事件之后,Windows将事件转换为一个将事件转换为一个消息消息并并将消息放入程序的将消息放入程序的消息队列消息队列中。中。l程序通过执行一块称之为程序通过执行一块称之为消息循环消息循环的程序代码从消息队列的程序代码从消息队列中取出消息。中取出消息。l以下是以下是WinMain()函数中消息循环的代码:函数中消息循环的代码:l/消息循环以调用消息循环以调用GetMessage()开始,它从消息队列中取出开始,它从消息队列中取出/一个消息一个消息lwhile(GetMessage(&msg,NUL
18、L,0,0)l l /将消息将消息msg结构传给结构传给Windows,进行一些键盘转换。,进行一些键盘转换。l TranslateMessage(&msg);l /将该消息发送给窗口消息处理程序进行处理。将该消息发送给窗口消息处理程序进行处理。l DispatchMessage(&msg);lWinMain()函数的大致结构函数的大致结构 lint PASCAL WinMain()ll/定义窗口类:定义窗口类:l WNDCLASS wndclass;l wndclass.style=CS_HREDRAW|CS_VREDRAW;l 十个字段十个字段l wndclass.lpszClassNam
19、e=”Lei”;l/注册窗口类:注册窗口类:l RegisterClass(&wndclass);l/创建窗口:创建窗口:l HWND hwnd;l hwnd=CreateWindow();l/显示及更新窗口:显示及更新窗口:l ShowWindow();l UpdateWindow();l/消息循环:消息循环:l MSG msg;l While(GetMessage(&msg,NULL,0,0)l TranlateMessage(&msg);l DispatchMessage(&msg)l l return msg.wParam;l2.3 窗口函数窗口函数WndProc()l窗口函数窗口函数
20、WndProc()就是就是Windows应用程序的消息应用程序的消息处理程序。处理程序。l窗口函数窗口函数WndProc()定义了应用程序对接收到的不同定义了应用程序对接收到的不同消息的响应,包含了对各种可能接收到的消息的处理消息的响应,包含了对各种可能接收到的消息的处理过程。过程。lWndProc函数由一个或多个函数由一个或多个switch语句组成。每一语句组成。每一条条case语句对应一种消息,当应用程序接收到一个消语句对应一种消息,当应用程序接收到一个消息时,相应的息时,相应的case语句被激活并执行相应的响应程序语句被激活并执行相应的响应程序模块。模块。l窗口消息处理程序不予处理的所有
21、消息被传给名为窗口消息处理程序不予处理的所有消息被传给名为DefWindowProc的的Windows函数进行默认处理。函数进行默认处理。消息处理函数消息处理函数WndProc的大致结构的大致结构 lLRESULT CALLBACK WndProc(HWND hMainwnd,UINT message,WPARAM wParam,LPARAM lParam)/窗口函数的定义窗口函数的定义l switch(message)l case WM_KEYDOWN:/击键消息击键消息l ;l break;l l case:l ;l break;l l l case WM_DESTROY:/关闭应用程序窗
22、口时发出的消息关闭应用程序窗口时发出的消息l PostQuitMessage(0);/发出发出WM_QUIT消息,结束应用程序消息,结束应用程序l return 0;l l default:break;ll /调用缺省消息处理过程调用缺省消息处理过程l return DefWindowProc(hMainwnd,message,wParam,lParam);l2.4 windows应用程序的常用数据类型应用程序的常用数据类型l所有的所有的Windows应用程序中,都有一个程序初始化的过程。应用程序中,都有一个程序初始化的过程。l下面以一个实现最简单功能的程序下面以一个实现最简单功能的程序Win
23、ApiDemo为例,说为例,说明明Windows程序的基本框架。操作步骤如下:程序的基本框架。操作步骤如下:l(1)打开)打开Visual C+6.0。选择选择File菜单的菜单的New,在出现的,在出现的对话框中,选择对话框中,选择Projects栏目(新建工程),并点取其下的栏目(新建工程),并点取其下的Win32 Application项,表示使用项,表示使用Win32环境创建应用程序。环境创建应用程序。l(2)在)在Locatin(路径)中填入工程的路径,然后在(路径)中填入工程的路径,然后在Project Name(项目名称)中填入(项目名称)中填入“WinApiDemo”,其它按照
24、缺省设,其它按照缺省设置,单击置,单击OK按钮。按钮。l(3)选择)选择File菜单的菜单的New,在出现的对话框中,选择,在出现的对话框中,选择Files栏栏目(新建文件),并点取其下的目(新建文件),并点取其下的C+Source File项,表示新项,表示新建一个建一个C+源文件。在右边的源文件。在右边的File栏中输入栏中输入“WinApiDemo”,最后确定让最后确定让Add to project检查框打上勾,单击检查框打上勾,单击OK按钮。按钮。l(4)在)在“WinApiDemo.cpp”文件中输入以下程序代码。文件中输入以下程序代码。2.5 API编程实例编程实例 WinApiD
25、emo.cpp源代码(源代码(1)l#include/头文件头文件lLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);l/窗口函数声明,这一函数将处理发往应用程序窗口的各种消息窗口函数声明,这一函数将处理发往应用程序窗口的各种消息lchar szClassName=windowclass;/窗口结构体的名称窗口结构体的名称lchar szAppTitle=API建立窗口实例建立窗口实例;/窗口的标题窗口的标题lINT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR
26、 lpszCmdParam,INT nCmdShow)l/WinMain()函数的定义函数的定义lHWND hMainWnd;/窗口句柄窗口句柄lMSG msg;/消息结构体消息结构体lWNDCLASS winclass;/窗口结构体窗口结构体l if(!hPrevInstance)l winclass.style=CS_HREDRAW|CS_VREDRAW;/窗口风格窗口风格l winclass.lpfnWndProc=WndProc;l winclass.cbClsExtra=0;/附加参数附加参数l winclass.cbWndExtra=0;/附加参数附加参数l winclass.hI
27、nstance=hInstance;/当前应用程序实例句柄当前应用程序实例句柄l winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/窗口图标窗口图标l winclass.hCursor=LoadCursor(NULL,IDC_ARROW);/窗口光标窗口光标 lwinclass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);l/窗口背景色为浅灰色窗口背景色为浅灰色l winclass.lpszMenuName=NULL;/窗口菜单窗口菜单l winclass.lpszClassName=szCl
28、assName;/给窗口结构体命名,给窗口结构体命名,l /CreateWindow()函数将根据窗口结构体的名称来建立窗口函数将根据窗口结构体的名称来建立窗口l RegisterClass(&winclass);/注册窗口注册窗口l WinApiDemo.cpp源代码(源代码(2)l /下面用下面用CreateWindow()函数来建立窗口,并返回所建立窗口的句柄函数来建立窗口,并返回所建立窗口的句柄l hMainWnd=CreateWindow(l szClassName,/窗口结构体的名称窗口结构体的名称l szAppTitle,/窗口的标题窗口的标题l WS_OVERLAPPEDWIN
29、DOW,/窗口风格为可重叠窗口窗口风格为可重叠窗口l /下面四个参数代表窗口左上角下面四个参数代表窗口左上角x,y坐标和窗口的宽度与高度,都使坐标和窗口的宽度与高度,都使l /用缺省值用缺省值l CW_USEDEFAULT,CW_USEDEFAULT,l CW_USEDEFAULT,CW_USEDEFAULT,l /下面参数分别为父窗口句柄、窗口菜单句柄、应用程序实例句柄下面参数分别为父窗口句柄、窗口菜单句柄、应用程序实例句柄l /和附加参数和附加参数l NULL,NULL,hInstance,NULL);l ShowWindow(hMainWnd,SW_SHOWNORMAL);l /显示最大
30、化窗口显示最大化窗口l UpdateWindow(hMainWnd);/更新窗口更新窗口l /下面用下面用While()循环来建立消息循环循环来建立消息循环l while(GetMessage(&msg,NULL,0,0)/获取消息,填充获取消息,填充msg结构体结构体l TranslateMessage(&msg);/翻译键盘消息翻译键盘消息lDispatchMessage(&msg);/向窗口函数发送消息,让窗口函数处理向窗口函数发送消息,让窗口函数处理l l return msg.wParam;lWinApiDemo.cpp源代码(源代码(3)lLRESULT CALLBACK WndP
31、roc(HWND hMainwnd,UINT message,WPARAM wParam,LPARAM lParam)/窗口函数的定义窗口函数的定义lswitch(message)l case WM_KEYDOWN:/击键消息击键消息l MessageBox(hMainwnd,键按下了键按下了!,Keyboard,MB_OK);l break;l l case WM_RBUTTONDOWN:/鼠标消息鼠标消息l MessageBox(hMainwnd,鼠标右键按下了鼠标右键按下了!,Mouse,MB_OK);l break;l l case WM_LBUTTONDOWN:/鼠标消息鼠标消息l
32、MessageBox(hMainwnd,鼠标左键按下了鼠标左键按下了!,Mouse,MB_OK);l break;l l case WM_DESTROY:/关闭应用程序窗口时发出的消息关闭应用程序窗口时发出的消息l PostQuitMessage(0);/发出发出WM_QUIT消息,结束应用程序消息,结束应用程序l return 0;l l default:break;ll /调用缺省消息处理过程调用缺省消息处理过程l return DefWindowProc(hMainwnd,message,wParam,lParam);lWinApiDemo.cpp源代码(源代码(4)l case WM_
33、RBUTTONDOWN:l MessageBox(GetFocus(),messageright,API建立窗口实例建立窗口实例,MB_OK|MB_ICONINFORMATION);lbreak;l l case WM_LBUTTONDOWN:l MessageBox(GetFocus(),messageleft,API建立窗口实例建立窗口实例,MB_OK|MB_ICONINFORMATION);lbreak;l l case WM_DESTROY:/关闭应用程序窗口时发出的消息关闭应用程序窗口时发出的消息l PostQuitMessage(0);l /发出发出WM_QUIT消息,结束应用程序
34、消息,结束应用程序lreturn 0;l l default:break;l lreturn DefWindowProc(hMainwnd,message,wParam,lParam);l/其它没有处理的消息交给其它没有处理的消息交给Windows做默认处理做默认处理lWinApiDemo的运行画面的运行画面3.游戏实现原理与游戏实现原理与Window GDI绘图绘图l3.1 游戏实现的基本原理游戏实现的基本原理l3.2 Window GDI基本概念基本概念l3.3 利用利用GDI实现游戏中的绘图实现游戏中的绘图3.1 游戏实现的基本原理游戏实现的基本原理3.2 Window GDI基本概念基
35、本概念lGDI,Graphics Device Interface,即图形设,即图形设备接口,是备接口,是Windows API的一个重要组成部的一个重要组成部分。分。lGDI是是Windows图形显示程序与实际物理设备图形显示程序与实际物理设备之间的桥梁,之间的桥梁,GDI使得用户无需关心具体设备使得用户无需关心具体设备的细节,而只需在一的细节,而只需在一 个虚拟的环境个虚拟的环境(即逻辑设即逻辑设备备)中进行操作。中进行操作。lGDI用一套通用的图形对象来向屏幕,內存甚用一套通用的图形对象来向屏幕,內存甚至是打印机绘图。至是打印机绘图。lGDI函数大致可分类为:函数大致可分类为:l设备上下
36、文函数:如设备上下文函数:如GetDC、CreateDC、DeleteDC。l画线函数:如画线函数:如LineTo、Polyline、Arc。l填充画图函数:如填充画图函数:如Ellipse、FillRect、Pie。l画图属性函数:如画图属性函数:如 SetBkColor、SetBkMode、SetTextColor。l文本、字体函数:如文本、字体函数:如TextOut、GetFontData。l位图函数:如位图函数:如 SetPixel、BitBlt、StretchBlt。l坐标函数:如坐标函数:如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen。l映
37、射函数:如映射函数:如SetMapMode、SetWindowExtEx、SetViewportExtEx。l元文件函数:如元文件函数:如PlayMetaFile、SetWinMetaFileBits。l区域函数:如区域函数:如FillRgn、FrameRgn、InvertRgn。l路径函路径函 数:如数:如BeginPath、EndPath、StrokeAndFillPath。l裁剪函数:如裁剪函数:如SelectClipRgn、SelectClipPath。设备上下文设备上下文l在在GDI编程中,几乎所有的操作都围绕设备上下文编程中,几乎所有的操作都围绕设备上下文(DC)展开。展开。l设备
38、上下文,设备上下文,Device Context,简称,简称DC,是,是Windows 使用的一种结构,所有使用的一种结构,所有GDI操作前都需操作前都需取得特定设备的上下文。取得特定设备的上下文。l设备上下文的句柄是设备上下文的句柄是HDC。lHDC是一个你可以向其绘图的句柄;它可以代表整是一个你可以向其绘图的句柄;它可以代表整个屏幕,一个窗口的客戶区域,一个存在內存中的个屏幕,一个窗口的客戶区域,一个存在內存中的位图,或是一个打印机。位图,或是一个打印机。l例如,如果你想在一个窗口上绘图,首先你要用例如,如果你想在一个窗口上绘图,首先你要用GetDC()来获取代表这个窗口的来获取代表这个窗
39、口的HDC,然后你就可以用任,然后你就可以用任何以何以HDC为参数的为参数的GDI函数来绘图了。函数来绘图了。位图位图l位图可以用位图可以用LoadBitmap()来完成大多数的基本来完成大多数的基本操作,比如简单地装入一个位图资源。操作,比如简单地装入一个位图资源。lGDI不能直接用位图对象来绘图,因为绘图操作不能直接用位图对象来绘图,因为绘图操作已经被设备上下文抽象了,只能通过设备上下已经被设备上下文抽象了,只能通过设备上下文来绘制位图。文来绘制位图。l利用位图绘图的大体思路是:把位图对象装入利用位图绘图的大体思路是:把位图对象装入设备上下文,通过设备上下文把位图显示在屏设备上下文,通过设
40、备上下文把位图显示在屏幕上。幕上。3.3 利用利用GDI实现游戏中的绘图实现游戏中的绘图l游戏中的绘图主要通过是绘制位图来实现的。游戏中的绘图主要通过是绘制位图来实现的。l在游戏中,因为角色位图的位置是不断变化的,在游戏中,因为角色位图的位置是不断变化的,所以设备上下文中的合成位图的内容也是不断所以设备上下文中的合成位图的内容也是不断变化的。变化的。l为了实现游戏画面的刷新,通常是利用缓存设为了实现游戏画面的刷新,通常是利用缓存设备上下文来保存下一帧的合成位图对象。备上下文来保存下一帧的合成位图对象。l下一帧的合成位图对象是根据角色位图的实时下一帧的合成位图对象是根据角色位图的实时位置和状态重
41、新渲染后的结果。位置和状态重新渲染后的结果。l下面举例给出了利用下面举例给出了利用GDI实现位图绘图的主要步骤:实现位图绘图的主要步骤:l定义定义windows屏幕设备句柄变量屏幕设备句柄变量windowDC;l定义窗口缓冲设备句柄变量定义窗口缓冲设备句柄变量bufferDC;l定义一个位图内存设备句柄变量定义一个位图内存设备句柄变量picDC;l定义一个位图句柄变量定义一个位图句柄变量picBMP;l定义一个缓冲位图句柄变量定义一个缓冲位图句柄变量bufferBMP;l调用调用GetDC()获取当前整个获取当前整个屏幕设备的句柄值,赋给屏幕设备的句柄值,赋给windowDC;l调用调用Cre
42、ateCompatibleDC()创建与创建与windowDC兼容的内存设备,并将其句柄值赋兼容的内存设备,并将其句柄值赋给位图内存设备变量给位图内存设备变量picDC。l调用调用CreateCompatibleDC()创建与创建与windowDC兼容的内存设备,并其句柄值赋给兼容的内存设备,并其句柄值赋给窗口缓冲设备变量窗口缓冲设备变量bufferDC。l调用调用CreateCompatibleBitmap()创建与创建与windowDC兼容的位图对象,并将该位图兼容的位图对象,并将该位图的句柄值赋给的句柄值赋给bufferBMP。l调用调用LoadBitmap()加载指定位图资源,并获取给
43、该位图资源的句柄值,赋给加载指定位图资源,并获取给该位图资源的句柄值,赋给picBMP。l调用调用SelectObject()将缓冲位图句柄将缓冲位图句柄bufferBMP和窗口缓冲设备句柄和窗口缓冲设备句柄bufferDC关关联。联。l调用调用SelectObject()将位图句柄将位图句柄picBMP和位图内存设备和位图内存设备picDC关联。关联。l两次调用特定运算的两次调用特定运算的BitBlt()函数来对位图内存设备函数来对位图内存设备picDC中的位图进行中的位图进行“去背去背”处理后,把结果保存在窗口缓冲设备处理后,把结果保存在窗口缓冲设备bufferDC中。中。l调用调用Bit
44、Blt()函数将窗口缓冲设备中的全部图像内容拷贝到屏幕设备函数将窗口缓冲设备中的全部图像内容拷贝到屏幕设备windowDC上上显示。显示。GetDC()函数函数l函数功能:该函数检索一指定窗口的客户区域函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以或整个屏幕的显示设备上下文环境的句柄,以后可以在后可以在GDI函数中使用该句柄来在设备上下文函数中使用该句柄来在设备上下文环境中绘图。环境中绘图。l函数原型:函数原型:HDC GetDC(HWND hWnd);l参数:参数:lhWnd:设备上下文环境被检索的窗口的句柄,如果:设备上下文环境被检索的窗口的句柄,如果该值
45、为该值为NULL,GetDC则检索整个屏幕的设备上下文则检索整个屏幕的设备上下文环境。环境。l返回值:如果成功,返回指定窗口客户区的设返回值:如果成功,返回指定窗口客户区的设备上下文环境;如果失败,返回值为备上下文环境;如果失败,返回值为Null。CreateCompatibleDC()函数函数l函数功能:该函数创建一个与指定设备兼容的函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(内存设备上下文环境(DC)。)。l函数原型:函数原型:HDC CreateCompatibleDC(HDC hdc);l参数:参数:lhdc:现有设备上下文环境的句柄,如果该句柄为:现有设备上下文环境的
46、句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。兼容的内存设备上下文环境。l返回值:如果成功,则返回内存设备上下文环返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为境的句柄;如果失败,则返回值为NULL。CreateCompatibleBitmap()函数函数l函数功能:该函数创建与指定的设备环境相关的设备函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。兼容的位图。l函数原型:函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth
47、,int nHeight);l参数:参数:lhdc:设备环境句柄。设备环境句柄。lnWidth:指定位图的宽度,单位为像素。:指定位图的宽度,单位为像素。lnHeight:指定位图的高度,单位为像素。:指定位图的高度,单位为像素。l返回值:如果函数执行成功,那么返回值是位图的位返回值:如果函数执行成功,那么返回值是位图的位图句柄;如果函数执行失败,那么返回值为图句柄;如果函数执行失败,那么返回值为NULL。LoadBitmap()函数函数l函数功能:该函数从模块的可执行文件中加载指定函数功能:该函数从模块的可执行文件中加载指定的位图资源。的位图资源。l函数原型:函数原型:HBITMAP Loa
48、dBitmap(HINSTANCE hInstance,LPCTSTR lpBitmapName);l参数:参数:lhlnstance:指向模块实例的句柄。:指向模块实例的句柄。llpBitmapName:指向字符串指针。该字符串包含了要加:指向字符串指针。该字符串包含了要加载的位图资源名称。载的位图资源名称。l返回值:如果函数执行成功,则返回值是指向指定返回值:如果函数执行成功,则返回值是指向指定位图的位图句柄。如果函数执行失败,那么返回值位图的位图句柄。如果函数执行失败,那么返回值是是NULL。SelectObject()函数函数l函数功能:该函数选择一对象到指定的设备上下函数功能:该函数
49、选择一对象到指定的设备上下文环境中。文环境中。l函数原型:函数原型:HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj);l参数:参数:lhdc:设备上下文环境的句柄。:设备上下文环境的句柄。lhgdiobj:被选择的对象的句柄,这些对象包括位图、:被选择的对象的句柄,这些对象包括位图、画刷、字体、笔、区域等。画刷、字体、笔、区域等。l返回值:如果选择对象不是区域并且函数执行成返回值:如果选择对象不是区域并且函数执行成功,那么返回值是对象的句柄。功,那么返回值是对象的句柄。BitBlt()函数函数 l函数功能:该函数对指定的源设备环境区域中的像素进函数功能
50、:该函数对指定的源设备环境区域中的像素进行位块转换,并传送到目标设备环境。行位块转换,并传送到目标设备环境。l函数原型:函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);l参数:参数:lhdcDest:指向目标设备环境的句柄。:指向目标设备环境的句柄。lnXDest:指定目标矩形区域左上角的:指定目标矩形区域左上角的X轴逻辑坐标。轴逻辑坐标。lnYDest:指定目标矩形区域左上角的:指定目标矩形区域左上角的Y轴