C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用链接

留言簿(8)

搜索

  •  

最新评论

阅读排行榜

评论排行榜


    绘图是属于
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

步骤三:选用位图对象

    位图对象是GDI6种对象之一,内存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++游戏编程基础》学习笔记——索引随笔

posted on 2010-04-08 15:28 烟皑 阅读(1062) 评论(0)  编辑 收藏 引用 所属分类: 《Visual C++游戏编程基础》学习笔记

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理