1、 要设置DirectDraw裁剪,需要执行以下步骤
① 创建DirectDraw裁剪器对象,使用IDIRECTDRAW7::CreateClipper()函数
② 创建裁剪序列(是矩形的列表,存储为RECT结构,这些矩形对应于可以进行blit的有效区域)
③ 用IDIRECTDRAWCLIPPER::SetClipList()将裁剪序列发送给裁剪器
④ 用IDIRECTDRAWSURFACE7::SetClipper()将裁剪器同窗口和/或表面相关联
2、 创建一个裁剪序列,只需填写一个成为RGNDATA(Region Data)的数据结构
typedef struct _RGNDATA {
RGNDATAHEADER rdh;
char Buffer[1];
} RGNDATA;
你所需要做的一切就是分配足够的内存给RGNDATAHEADER结构,连同一块用以存储一个或多个连续RECT结构的内存。
3、 多数时候都是用离屏渲染表面的指针来调用SetClipper,通常,你并不会将裁剪器关联到主表面。
4、 
位图文件头:它存放着图像的总体信息,存放在Win32数据结构BITMAPFILEHEADER
typedef struct tagBITMAPFILEHEADER {
WORD bfType;//文件类型,必须为0x4D42 for BMP
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
位图信息段:包括两部分数据结构,即BITMAPINFOHEADER部分和调色板信息部分(如果有的话)。
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; //the info header
RGBQUAD bmiColors[1];//palette(if there is one)
} BITMAPINFO;
BITMAPINFOHEADER结构如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
8位图像通常使biClrUsed和biClrImportant两字段均为256,而16位或24位图像则均为0,因此,应当通过测试biBitCount找出每像素有多少位。
位图数据区:它是一个字节流,描述了1、4、8、16或24位图像像素,数据是逐行排列的,但是有时会颠倒过来,即数据的第一行其实是图像的最后一行。 可以通过biHeight的正负号来知道这点,正值表示颠倒,负值表示正常。
为了自行读取一个.BMP文件,首先需要打开它,然后读取BITMAPFILEHEADER,接着读BITMAPINFO部分,即BITMAPINFOHEADER外加调色板,调色板项是RGBQUAD,是正常的PALETTEENTRYs的倒序:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
5、 文件读取:
int file_handle;
OFSTRUCT file_data;
OpenFile(file_handle, &file_data, OF_READ);
_lread(file_handle, ..);
_lseek(file_handle, ..);
_lclose(file_handle);
6、 在调色板同8位DirectDraw表面关联之后改变调色板项,你只需使用IDIRECTDRAWPALETTE::SetEntries()函数。
7、 DirectDraw存在的目的就在于利用硬件加速,可是除非你用DirectDraw的数据结构和对象来保存位图,否则你是不能做到这点的。DirectDraw是使用blitter的关键。
创建一个通用的既非主表面又非后备缓冲的离屏DirectDraw表面:
① 必须将DDSURFACEDESC2.dwFlags设置为(DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT)
② 必须在DDSURFACEDESC2.dwWidth和DDSURFACEDESC2.dwHeight中设置请求表面的尺寸
③ 必须将DDSURFACEDESC2.ddsCaps.dwCaps设置为DDSCAPS_OFFSCREENPLAIN | memory_flags,其中的memory_flags决定在哪里创建表面。 如果将它设置为DDSCAPS_VIDEOMEMORY,则表面将被创建在VRAM中,如果将它设置为DDSCAPS_SYSTEMMEMORY,表面将被建立在系统内存中,这使blitter几乎不会被用到,因为位图数据不得不通过系统总线传输。

8、 设置blitter,需要执行以下步骤:
① 设置要blit出来的源RECT结构,则是包含相关图像的小的表面
② 设置目标RECT,通常就是后备缓冲
③ 用适当的参数调用IDIRECTDRAWSURFACE7::Blt()
如果你使目标RECT比源RECT大或者小,图形转换将自动缩放图像来适应你指定的目标尺寸。
9、 色彩键(ColorKey)
① 源色彩键:一般而言,你可以选择单一色彩索引(256色模式下)或者一定范围的RGB色彩作为源图像的透明色。然后,将源blit向目标时,不拷贝具有透明色的像素。你既可以在创建表面时设置色彩键,也可以在之后用函数IDIRECTDRAWSURFACE7::SetColorKey()设置。
如果你为源色彩键设置了一个色彩范围(色彩空间),在调用SetColorKey()时必须加上标志DDCKEY_COLORSPACE,否则DirectDraw将使色彩范围坍缩为一个值。
② 目标色彩键:基本思想是: 你可以在目标表面上设定一种或者一个色彩范围,具有这样的颜色的像素不能够被blit上去。设置目标色彩键与设置源色彩键方法相同,只需要改变两个标志。DDSD_CKDSTBLT ddsd.ddckCKDestBlt
10、当你进行blit时要考虑到裁剪,还没有设置好裁剪区就开始朝表面上进行blitting会很糟糕,你需要做的就是调用你的DDraw_Attach_Clipper函数,设一个单独的同屏幕边界等大的裁剪矩形区域。