使用背景图象与透明色的文字的描绘(转)

使用背景图象与透明色的文字的描绘(转)[@more@]

  显示背景图象,再在上面使用透明色显示文本文字。

  Display 与储存背景图象和文本文字的 Surface(表面|描绘用内存区) 。

  g_bActive 是 DirectDraw 初始化成功的标志:

  CDisplay*  g_pDisplay  = NULL;

  CSurface*  g_pBmpSurface = NULL;

  CSurface*  g_pTextSurface= NULL;

  BOOL    g_bActive   = FALSE;

  

  创建背景图象 Surface 的代码。

  输入的图象大小是 320*240 ,象下面这种写法,会把它扩展到 640*480 来储存:

  if (FAILED(hr= g_pDisplay->CreateSurfaceFromBitmap(&g_pBmpSurface,

  "G:DirectX 8旷野中的小屋.bmp",640,480)))

  return hr;

  

  文本文字 Surface 及 ColorKey(颜色键值) 的设定。

  所谓 ColorKey ,就是"透明色",把指定的颜色变成透明的,使背景图象能够透过。通常把黑色(0)设为透明色。

  等这篇的例子编译成功以后,把下面这段代码中含有 SetColorKey() 的语句注释起来跳过编译,再对比一下前后的执行效果,"透明色"的意思就会一目了然。

  if (FAILED(hr= g_pDisplay->CreateSurfaceFromText(&g_pTextSurface,    NULL,"旷野中的小屋",RGB(0,0,0),RGB(0,255,0))))    return hr;  // Set the color key for the logo sprite to black  if (FAILED( hr = g_pTextSurface->SetColorKey(0)))  return hr;

  

  创建窗口的代码试着给它尽量简化:

  WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0L,0L,

  GetModuleHandle(NULL),NULL,NULL,NULL,NULL,NAME,NULL

  };

  if (RegisterClassEx(&wc)==0)  return FALSE;

  HWND hWnd = CreateWindow( NAME,NAME,WS_OVERLAPPEDWINDOW,

  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

  GetDesktopWindow(),NULL,wc.hInstance,NULL);

  if (hWnd==NULL)  return FALSE;

  

  下面说明工程的创建方法。

  这回仍然要用到 Common 文件夹下保存着的那4个文件,这4个文件实在太麻烦把工程往别处挪一挪就要出错,做个工程不容易,文件夹一移动就出错了。这回我们把那4个文件直接复制过来,复制到工程文件夹!

  这样就没事了,想挪哪里挪哪里,没事。创建工程也简单了。不过就是硬盘上多了那4个文件的几份拷贝。

  其实只是在编译的时候才用得上那4个文件,编译完成以后删了没问题。

  

  1. 新建一个 Win32 Application 空白工程,命名为 "Colkey"。

  

  2. 向工程中新建一个 C++ Source File ,命名为 "colkey" ,向其中键入篇末附带的源程序。

  

  3. 把下面4个文件复制到工程文件夹(我是 G:DirectX 8Colkey):

  E:MssdksamplesMultimediaCommonincludeddutil.h

  E:MssdksamplesMultimediaCommonincludedxutil.h

  E:MssdksamplesMultimediaCommonsrcddutil.cpp

  E:MssdksamplesMultimediaCommonsrcdxutil.cpp

  然后选择菜单 [Project|工程]-[Add To Project|添加到工程]-[Files...|文件...] ,向工程中添加这4个文件。

  

  4. 准备合适的背景图象文件(我是在 G:DirectX 8 下放了张 "旷野中的小屋.bmp")。

  

  5. 选择菜单 [Project|工程]-[Settings...|设定...] 打开[Project Settings|工程设定] 面板,点击 [Link|链接] 标签,向 [Object/library modules|对象、库模块] 栏内添加下面4个库文件:

  dxguid.lib

  ddraw.lib

  dxerr8.lib

  winmm.lib

  
2004.12.26.10.24.22.1.gif

  6. 编译并执行!

  源程序:

  /*****************************************************************/

  /*★ 使用背景图象与透明色的文字的描绘   2001-01-15 前田 稔 ★*/

  /*****************************************************************/

  #define   NAME    "Color Key"

  #define   STRICT

  #include  

  #include  

  #include  

  #include  "ddutil.h"

  

  // Defines, constants, and global variables

  #define SAFE_DELETE(p) { if (p) { delete (p);   (p)=NULL; } }

  #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }

  #define ERMSG(x)    MessageBox(hWnd, x, "DirectDraw Samplee", MB_OK);

  

  CDisplay*  g_pDisplay  = NULL;

  CSurface*  g_pBmpSurface = NULL;

  CSurface*  g_pTextSurface= NULL;

  BOOL    g_bActive   = FALSE;

  

  // Function-prototypes

  LRESULT   CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  HRESULT   InitDraw(HWND hWnd);

  VOID    FreeDraw();

  HRESULT   DisplayFrame();

  

  //★ Windows Main

  int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)

  {  MSG   msg;

  

  WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0L,0L,

  GetModuleHandle(NULL),NULL,NULL,NULL,NULL,NAME,NULL

  };

  if (RegisterClassEx(&wc)==0)  return FALSE;

  HWND hWnd = CreateWindow( NAME,NAME,WS_OVERLAPPEDWINDOW,

  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

  GetDesktopWindow(),NULL,wc.hInstance,NULL);

  if (hWnd==NULL)  return FALSE;

  

  if (FAILED(InitDraw(hWnd)))

  {  if (g_pDisplay)

  g_pDisplay->GetDirectDraw()->SetCooperativeLevel(NULL, DDSCL_NORMAL);

  ERMSG("DirectDraw init failed");

  return FALSE;

  }

  

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  while(TRUE)

  {  if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))

  {  if (0==GetMessage(&msg, NULL, 0, 0)) return (int)msg.wParam;

  TranslateMessage(&msg);

  DispatchMessage(&msg);

  }

  else

  {  if (g_bActive)

  {  if (FAILED(DisplayFrame()))

  {  SAFE_DELETE(g_pDisplay);

  ERMSG("Displaying the next frame failed");

  return FALSE;

  }

  }

  else  WaitMessage();

  }

  }

  }

  

  //★ WndProc()

  LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

  {  switch(msg)

  {  case WM_KEYDOWN:

  PostMessage(hWnd, WM_CLOSE, 0, 0);

  return 0L;

  case WM_SIZE:

  if (SIZE_MAXHIDE==wParam || SIZE_MINIMIZED==wParam)

  g_bActive = FALSE;

  else  g_bActive = TRUE;

  break;

  case WM_SETCURSOR:     //隐藏光标

  SetCursor(NULL);

  return TRUE;

  case WM_SYSCOMMAND:

  switch(wParam)

  { case SC_MOVE:

  case SC_SIZE:

  case SC_MAXIMIZE:

  case SC_MONITORPOWER:

  return TRUE;

  }

  break;

  case WM_DESTROY:

  FreeDraw();

  PostQuitMessage(0);

  return 0L;

  }

  return DefWindowProc(hWnd, msg, wParam, lParam);

  }

  

  //★ InitDraw()

  HRESULT InitDraw(HWND hWnd)

  {  HRESULT   hr;

  

  g_pDisplay = new CDisplay();

  if (FAILED(hr= g_pDisplay->CreateFullScreenDisplay(hWnd,640,480,16)))

  {  ERMSG("This display card does not support 640x480x16.");

  return hr;

  }

  // Create a surface, and draw a bitmap resource on it.

  if (FAILED(hr= g_pDisplay->CreateSurfaceFromBitmap(&g_pBmpSurface,

  "G:DirectX 8旷野中的小屋.bmp",640,480)))

  return hr;

  if (FAILED(hr= g_pDisplay->CreateSurfaceFromText(&g_pTextSurface,

  NULL,"旷野中的小屋",RGB(0,0,0),RGB(0,255,0))))

  return hr;

  // Set the color key for the logo sprite to black

  if (FAILED( hr = g_pTextSurface->SetColorKey(0)))  return hr;

  return S_OK;

  }

  

  

  //★ DisplayFrame()

  HRESULT DisplayFrame()

  {  HRESULT hr;

  

  g_pDisplay->Clear(0);

  // Blt all the sprites onto the back buffer using color keying

  g_pDisplay->Blt(0,0,g_pBmpSurface,NULL);

  g_pDisplay->Blt(230,200,g_pTextSurface,NULL);

  if (FAILED(hr= g_pDisplay->Present())) return hr;

  return S_OK;

  }

  

  //★ FreeDraw()

  VOID FreeDraw()

  {  SAFE_DELETE(g_pBmpSurface);

  SAFE_DELETE(g_pDisplay);

  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-952198/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-952198/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值