绘图是属于GDI的对象之一,在一套游戏开发过程中,常常需要运用大量的位图来构建游戏的所有画面。
以游戏程序来说,由于使用的位图数量相当多,因此都会先将位图存成文件,等到程序需要时再将文件加载到窗口中。
将位图从文件中加载到绘制窗口中必须经过以下几个步骤:
①从文件中加载位图(BITMAP)对象。
②建立一个与窗口DC兼容的内存DC。
③内存DC使用步骤1所建立的位图对象。
④将内存DC的内容粘帖到窗口DC中,完成显像的操作。
以上是大致的流程,接下来一步步地说明如何完成这些操作
步骤一:加载位图
要从文件加载位图,常使用LoadImage()函数
HANDLE LoadImage( HINSTANCE 来源实体, //加载位图
LPCTSTR 名称,
UINT 位图类型,
int 加载宽度,
int 加载高度,
UINT 加载方式,);
详细说明如下:
参数
|
说明
|
HINSTANCE
|
包含位图所在的实体,若要加载的位图存在于硬盘或者资源文件中,则将此项参数设为”NULL”
|
LPCTSTR
|
要加载位图所在的路径与文件名或者资源名称
|
UINT
|
加载位图的类型,有下列3种:
◆IMAGE_BITMAP:加载的位图为一般图文件,扩展名为“.bmp”
◆IMAGE_CURSOR:加载的位图为光标图标,扩展名为“.cur”
◆IMAGE_ICON:加载的位图为图标,扩展名为“.ico”
|
int
|
位图加载的宽度,单位为像素
|
int
|
位图加载的高度,单位为像素
|
UINT
|
设定位图的加载方式,若是从文件中加载位图,则设为“LR_LOADFROMFILE
|
步骤二:建立与窗口DC兼容的内存DC
内存DC并不是真正的设备的DC,在这里把它揭示为一个缓冲区或许会更恰当些。内存DC用来暂存加载的位图,由于最终会把存储在这个内存DC上的位图贴到真正的窗口的DC上,因此这个内存DC必须跟窗口DC的性质兼容。可调用CreateCompatibleDC()函数来建立内存DC。
HDC CreateCompatibleDC(HDC hdc); // 建立兼容DC
函数中输入的唯一参数就是要与内存DC兼容的目的DC。跟窗口DC一样,内存DC使用后也必须进行释放的操作,释放内存DC所调用的函数为DeleteDC()。
DeleteDC(HDC DC名称); //释放DC
步骤三:选用位图对象
位图对象是GDI的6种对象之一,内存DC选用位图对象的方法和前面介绍的选用画笔或画刷的方式相同,都是通过调用SelectObject()函数来实现。
步骤四:贴图
把内存DC中的位图复制到显示的DC上,这个操作被称为“贴图”。函数是BitBlt():
BOOL BitBlt ( HDC 目的DC,
int 目的DC X坐标,
int 目的DC Y坐标,
int 贴到目的DC的宽度,
int 贴到目的DC的高度,
HDC 来源DC,
int 来源DC X坐标,
int 来源DC Y坐标,
DWORD 贴图方式)
BitBlt()函数最后一个参数所输入的是称为“Raster”的运算值,这个值是用来设定内存DC到目的DC的贴图方式。范例中输入的Raster值是SRCCOPY,表示贴图后的位图与原来的位图完全一样,下表列出了可使用的Raster值及说明。
Raster值
|
说明
|
BLACKNESS
|
将来源位图转换为黑色
|
DSTINVERT
|
将目的地DC做“NOT”运算
|
MERGECOPY
|
将选择的笔刷与来源位图做“AND”运算
|
MERGEPAINT
|
先将来源位图做“NOT”运算,再与目的地DC做“OR”运算
|
NOTSRCCOPY
|
将来源位图做“NOT”运算
|
NOTSRCERASE
|
先将来源位图与目的地DC做“OR”运算,再将其做“NOT”运算
|
PATCOPY
|
将选择的笔刷贴到目的地DC上
|
PATINVERT
|
将目的地DC与选择的笔刷做“XOR”运算
|
PATPAINT
|
先将来源位图做“NOT”运算,再与笔刷做“OR”运算,最后再与目的地DC做“OR”运算
|
SRCAND
|
将来源位图与目的地DC做“AND”运算
|
SRCCOPY
|
将来源位图贴到目的地DC上
|
SRCERASE
|
先将目的地DC做“NOT”运算,再与来源位图做“AND”运算
|
SRCINVERT
|
将来源位图与目的地DC做“XOR”运算
|
SRCPAINT
|
将来源位图与目的地DC做“OR”运算
|
WHITENESS
|
将来源位图转换为白色
|
范例ch2_5:从文件中加载位图,并显示在窗口上。
下载地址:ch2_5(上传到windows live空间,可能需要MSN账号登陆)
说明:程序源代码中有相关的注释。
程序运行结果如下图:
PS:如想获得更多关于Visual C++游戏开发的内容,可点击随笔:《Visual C++游戏编程基础》学习笔记——索引随笔。