DirectX5.0最新游戏编程指南 DirectDraw教程篇 二、第一个DirectDraw实例(9) lpDDSPrimary = NULL; } lpDD->Release(); lpDD = NULL; }} /* finiObjects */ 程序检测DirectDraw对象的指针(lpDD)和DirectDrawSurface对象的指针(lpDDSPrimary) 是否等于NULL,本例中显然不为NULL。然后DDEX1调用 IDirectDrawSurface::Release方法将DirectDrawSurface 对象的参考值减1,这将会使得其参考值变为0,DirectDrawSurface 对象就被释放了,DirectDrawSurface的指针被设为NULL值,然后撤消。程序又调用IDirectDraw::Release就DirectDraw对象的参考值减1变为0,释放DirectDraw对象及其指针。 上述的DDEX1是DirectDraw最基本的应用,它首先创建DirectDraw对象和DirectDrawSurface对象,创建一个主表面及其后台缓冲区,将文本输出到后台缓冲区,然后转化表面。第二个例子DDEX2扩展了DDEX1的功能,它可以将一个位图文件调入后台缓冲区。第三个例子DDEX3 则更进一步,除了一个主表面及后台缓冲区外,还创建了两个屏外表面,将位图调入每一个屏外表面,然后使用IDirectDrawSurface::BltFast方法将一个屏外表面的内容位块传输到后台缓冲区,然后翻转表面并将另一个屏外表面的内容位块传输到后台缓冲区。下面将详细讨论这些功能。
11、将位图调入表面 如DDEX1中一样,doInit函数是DDEX2的初始化函数,两者的实质一样,一直到下面的代码:lpDDPal = DDLoadPalette(lpDD, szBackground); if (lpDDPal == NULL) goto error; ddrval = lpDDSPrimary->SetPalette(lpDDPal); if( ddrval != DD_OK ) goto error; // load a bitmap into the back buffer. ddrval = DDReLoadBitmap(lpDDSBack, szBackground); if( ddrval != DD_OK ) goto error; 代码的第一行从函数DDLoadPalette返回一个值,该函数在C:\ DX5SDK\SDK\SAMPLES\MISC中的Ddutil.cpp文件中,因此编译DDEX2时需要将Ddutil.cpp和Ddutil.h加入过程。大部分的DirectDraw程序都需要该文件。在DDEX2中,DDLoadPalette函数从Back.bmp文件中创建一个DirectDrawPalette对象。DDLoadPalette函数首先检查用于创建调色板的文件或资源十分存在,如果不存在,就创建一个缺省调色板。在DDEX2中,它从位图文件中抽取调色板信息并存储在由ape指向的结构,然后如下创建 DirectDrawPalette对象: pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL); return ddpal;