向DirectDraw里载入位图
Kieren Johnstone 著
李成竹 译
2005-7-18
介绍
嗨,大家好!
在这篇文章里我将介绍如何利用Windows的函数来载入位图,并显示在新建的DDraw表面上。本文内容将用到DirectX 7.0 SDK。
创建DirectDrawSurface
要创建一个DDraw表面非常任容易,下面这个函数可以创建一个任意大小的表面。它也可以像一个普通表面创建函数一样使用。如果你正在写一个引擎,你可能会把它放在某个地方。
void CreateSurface(LPDIRECTDRAWSURFACE7 *lpSource, int xs, int ys)
{
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = xs;
ddsd.dwHeight = ys;
lpdd->CreateSurface(&ddsd, lpSource, NULL);
}
以上代码就是创建一个DDSURFACEDESC2结构体来描述表面,然后告述DirectDraw那是个离屏表面,最后调用DDraw 创建表面。
加载位图
我们使用Windows Graphics
Library(GDI)来装载.bmp位图。这是最好的方法,因为如果我们使用调色板模式,Windows将自动映射位图到最接近的调色板。下面是blits一个已加载的位图到表面的代码
void DrawHBitmap(IDirectDrawSurface7 *lpSurface, HBITMAP hBitmap, int x, int y, int width, int height)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
if (lpSurface == NULL || hBitmap == NULL)
return;
lpSurface->Restore();
hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hBitmap);
GetObject(hBitmap, sizeof(bm), &bm);
width = width == 0 ? bm.bmWidth : width;
height = height == 0 ? bm.bmHeight : height;
lpSurface->GetDC(&hdc);
BitBlt(hdc, x, y, width, height, hdcImage, 0, 0, SRCCOPY);
lpSurface->ReleaseDC(hdc);
DeleteDC(hdcImage);
}
这是装载、blits并删除位图的代码
void CreateBitmapSurface(LPDIRECTDRAWSURFACE7 lpSurface, char *fname, int xs, int ys)
{
HBITMAP hBitmap;
CreateSurface(&lpSurface, xs, ys);
hBitmap = LoadImage(NULL, fname, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
DrawHBitmap(lpSurface, hBitmap, 0, 0, xs, ys);
DeleteObject(hBitmap);
}
例子
将所有内容串起来,下面的示例代码会装载“test.bmp”到lpddsTest表面,然后释放。
void Example(void)
{
//声明表面对象
LPDIRECTDRAWSURFACE7 lpddsTest;
//载入位图
CreateBitmapSurface(lpddsTest, Test.bmp? 128, 128);
//释放表面
lpddsTest->Release();
}