中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
向DirectDraw里载入位图
作者:未知 时间:2005-07-27 23:31 出处:CSDN 责编:chinaitpower
              摘要:向DirectDraw里载入位图

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有