|
向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(); }
|