使用背景图象与透明色的文字的描绘(转)[@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
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/