DDSURFACEDESC2 简介

由于要显示dds图片,所以在网上搜索了下DDSURFACEDESC2结构体的简介

DDSURFACEDESC2:

typedef struct _DDSURFACEDESC2 {

DWORD dwSize;

DWORD dwFlags;

DWORD dwHeight;

DWORD dwWidth;

union

{

LONG lPitch;

DWORD dwLinearSize;

} DUMMYUNIONNAMEN(1);

DWORD dwBackBufferCount;

union

{

DWORD dwMipMapCount;

DWORD dwRefreshRate;

} DUMMYUNIONNAMEN(2);

DWORD dwAlphaBitDepth;

DWORD dwReserved;

LPVOID lpSurface;

DDCOLORKEY ddckCKDestOverlay;

DDCOLORKEY ddckCKDestBlt;

DDCOLORKEY ddckCKSrcOverlay;

DDCOLORKEY ddckCKSrcBlt;

DDPIXELFORMAT ddpfPixelFormat;

DDSCAPS2 ddsCaps;

DWORD dwTextureStage;

} DDSURFACEDESC2, FAR *LPDDSURFACEDESC2;

坦率的说,编写DirectDraw的应用程序其实并不难。但是事情往往是这样,80%的工作只需要我们花费20%的时间就可以完成,而剩下的20%的工作却需要我们花费80%的时间来完成。DirectDraw编程比这还要严重,就笔者的看法,至少90%的工作只需要我们不到10%的时间来完成,而剩下的不到10%的工作却至少需要我们90%的时间!结构DDSURFACEDESC就是10%的一部分,它较为复杂,它嵌套了其它的结构。让我们看看这个怪物到底做了什么。我只说说重点的部分:

· DWORD dwSize:任何DirectX结构都有dwSize这个成员,表示结构的大小。有了它,当函数接收到指向这些结构的指针时,就可以测定结构的大小了。

· DWORD dwFlags:太好了,又有一大堆标志常量了^_^ !这些标志告诉接收函数哪些数据成员是有效的。要想使需要的数据成员有效,就必须传递相对应的标志常量给dwFlags,你当然可以用“|”组合它们。以下是列表:

◎ DDSD_ALL:所有的数据成员都有效。

◎ DDSD_ALPHABITDEPTH:表示数据成员dwAlphaBitDepth有效。

◎ DDSD_BACKBUFFERCOUNT:表示数据成员dwBackBufferCount有效。

◎ DDSD_CAPS:表示数据成员ddsCaps有效。

◎ DDSD_CKDESTBLT:表示数据成员ddckCKDestBlt有效。

◎ DDSD_CKDESTOVERLAY:表示数据成员ddckCKDestOverlay有效。

◎ DDSD_CKSRCBLT:表示数据成员ddckCKSrcBlt有效。

◎ DDSD_CKSRCOVERLAY:表示数据成员ddckCKSrcOverlay有效。

◎ DDSD_HEIGHT:表示数据成员dwHeight有效。

◎ DDSD_LINEARSIZE:表示数据成员dwLinearSize有效。

◎ DDSD_LPSURFACE:表示数据成员lpSurface有效。

◎ DDSD_MIPMAPCOUNT:表示数据成员dwMipMapCount有效。

◎ DDSD_PITCH:表示数据成员lPitch有效。

◎ DDSD_PIXELFORMAT:表示数据成员ddpfPixelFormat有效。

◎ DDSD_REFRESHRATE:表示数据成员dwRefreshRate有效。

◎ DDSD_TEXTURESTAGE:表示数据成员dwTextureStage有效。

◎ DDSD_WIDTH:表示数据成员dwWidth有效。

· DWORD dwheight,dwWidth:表示要创建表面的尺寸。以象素为单位。

· LONG lPitch:这个需要好好解释一下。lPitch表示从画面一行行首数据到下一行行首数据的距离,以字节为单位。例如,640×480×16,每一行有640个象素,每个象素需要两个字节装颜色的信息,所以pitch应该是1280个字节,对不对?可能有一些显示卡要多于1280,这每行多于的内存没有装置任何的图形数据,但是防备有些显示卡不能在线性内存模式显示图形,你还是把多于地放在那吧。这种情况很少发生,但你最好还是考虑在内。

· LPVOID lpSurface:指向表面内存开始地址的指针。不管你使用什么显示模式,你都可以用DirectDraw创建的线性地址模式操作表面象素。要想这样,你必须锁住表面,但这已经超出我们现在所学的了。

· DWORD dwBackBufferCount:后缓冲区的数目。以后我们会在提到它。

· DWORD ddckCKDestBlt,ddckCKSrcBlt:前者为描述位转换操作的目标颜色值,后者是源颜色值。我们将在以后的文章中具体介绍。

· DDPIXELFORMAT ddpfPixelFormat:这个结构包含了描述显示模式的象素格式标识符。以后会具体介绍,现在就不多说了。

· DDSCAPS2 ddsCaps:这是最后一个重要的结构。它是一个充满控制标志的结构。感谢菩萨,这是一个小结构,结构成员中只有一个很重要。让我们看一看:

typedef struct _DDSCAPS2{

DWORD dwCaps;

DWORD dwCaps2;

DWORD dwCaps3;

DWORD dwCaps4;

} DDSCAPS2, FAR* LPDDSCAPS2;

最重要的就是dwCaps了。第三个和第四个成员从来没有用过,是为将来准备的。总之,dwCaps可以使用如下的值,当然可以用“|”组合。以下是最为常用的,其它的你若有兴趣,自己查好了。

· DDSCAPS_BACKBUFFER:指出这个表面是需要表面切换结构的后缓冲区。

· DDSCAPS_COMPLEX:是一个复杂表面,由主表面,一个或多个粘贴表面组成,通常是为了页面切换。

· DDSCAPS_FLIP:指出这个表面是表面切换结构的一部分。前缓冲区紧跟着一个或多个建立好的后缓冲区。

· DDSCAPS_FRONTBUFFER:是关于表面切换结构的前缓冲区。

· DDSCAPS_LOCALVIDMEM:指出在true、local video memory【不知怎么翻译】中建立表面。如果使用该标志,必须也同时使用DDSCAPS_VIDEOMEMORY标志,但不能同DDSCAPS_NONLOCALVIDMEM标志同时使用。

· DDSCAPS_MODEX:指出这个表面是Mode X模式(320×200或320×240)的表面。

· DDSCAPS_NONLOCALVIDMEM:指出表面建立在non-local video memory【不知怎么翻译】中。如果定义该标志,必须也同时使用DDSCAPS_VIDEOMEMORY标志。但是不能同DDSCAPS_LOCALVIDMEM同时使用。

· DSCAPS_OFFSCREENPLAIN:这是一个简单的离屏表面。

· DDSCAPS_OWNDC:这个表面将具有长周期的设备上下文。

· DDSCAPS_PRIMARYSURFACE:主表面。

· DDSCAPS_STANDARDVGAMODE:是标准的VGA模式表面。不能同DDSCAPS_MODEX同用。

· DDSCAPS_SYSTEMMEMORY:建立在系统内存里的表面。

· DDSCAPS_VIDEOMEMORY:这个表面建立在显示内存里。

天啊,终于介绍完了这个结构。现在我们准备建立表面吧。第一步当然是填充DDSURFACEDESC2结构。Microsoft推荐大家当你使用一个结构之前,你应该把它先初始化为0。

转自:http://hi.baidu.com/homcom/item/bda286cef4993979ced4f89e

你可能感兴趣的:(DDRAW,DDSURFACEDESC2)