⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmap.cpp

📁 最好的水波特效代码
💻 CPP
字号:
// Bitmap.cpp: implementation of the Bitmap class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Bitmap.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Bitmap::Bitmap(LPDIRECTDRAW7 lpdd, int cx ,int cy)
{
	width = cx, height = cy;

	DDSURFACEDESC2 ddsd;
	ZeroMemory(&ddsd,sizeof(ddsd));
	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
	ddsd.dwWidth = width;
	ddsd.dwHeight = height;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;

	lpdd->CreateSurface(&ddsd, &lpdds, NULL);
}

Bitmap::~Bitmap()
{
	if(lpdds) lpdds->Release();
	lpdds = NULL;
}

HRESULT Bitmap::Draw(LPDIRECTDRAWSURFACE7 drawingsurface,int x, int y)
{
	RECT rc = { 0, 0, width, height};
	return drawingsurface->BltFast(x, y, lpdds, &rc, 
		DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
}

BOOL Bitmap::LoadBitmap(LPCTSTR filename, int x, int y)
{
	HBITMAP hbmp = (HBITMAP)LoadImage(GetModuleHandle(NULL), 
		filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

	HDC xdc;
	lpdds->GetDC(&xdc);

	HDC hdc = CreateCompatibleDC(xdc);
	SelectObject(hdc, hbmp);

	BitBlt(xdc, 0, 0, width, height,
		hdc, x, y, SRCCOPY);

	lpdds->ReleaseDC(xdc);

	DeleteDC(hdc);
	DeleteObject(hbmp);

	return TRUE;
}

HRESULT Bitmap::SetColorKey(COLORREF key)
{
	DDCOLORKEY ddkey;
	ddkey.dwColorSpaceHighValue = key;
	ddkey.dwColorSpaceLowValue = key;
	return lpdds->SetColorKey(DDCKEY_SRCBLT, &ddkey);
}

HRESULT Bitmap::CreateSurface(LPDIRECTDRAW7 lpdd, int cx, int cy)
{
	width = cx, height = cy;

	DDSURFACEDESC2 ddsd;
	ZeroMemory(&ddsd,sizeof(ddsd));
	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
	ddsd.dwWidth = width;
	ddsd.dwHeight = height;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;

	return lpdd->CreateSurface(&ddsd, &lpdds, NULL);
}

HRESULT Bitmap::AlphaBlendDraw(LPDIRECTDRAWSURFACE7 drawingsurface, int x, int y, int alpha)
{
#define GetRValue565(color) (((color) >> 11) & 0x1F)
#define GetGValue565(color) (((color) >> 5) & 0x3F)
#define GetBValue565(color) ((color) & 0x1F)
#define RGB16BIT565(r,g,b) ((b%32) + ((g%64) << 5) + ((r%32) << 11))
	alpha = alpha % 32;

	unsigned short* dest, *src;
	int pitch;

	DDSURFACEDESC2 ddsd = { sizeof(ddsd)};
	drawingsurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);
	dest = (unsigned short*)ddsd.lpSurface;
	pitch = ddsd.lPitch/sizeof(unsigned short);

	ZeroMemory(&ddsd, sizeof(ddsd));
	ddsd.dwSize = sizeof(ddsd);
	lpdds->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);
	src = (unsigned short*)ddsd.lpSurface;

	dest = dest + y*pitch + x;

	BYTE destR,destG,destB,srcR,srcG,srcB;
	for( int i = 0 ; i < height; ++i)
	{
		for( int j = 0; j < width; ++j)
		{
			destR	=	GetRValue565(dest[j]);
			srcR	=	GetRValue565(src[j]);
			destR	=	(destR * alpha + (32 - alpha) * srcR) >> 5;

			destG	=	GetGValue565(dest[j]);
			srcG	=	GetGValue565(src[j]);
			destG	=	(destG * alpha + (32 - alpha) * srcG) >> 5;

			destB	=	GetBValue565(dest[j]);
			srcB	=	GetBValue565(src[j]);
			destB	=	(destB * alpha + (32 - alpha) * srcB) >> 5;

			dest[j] = RGB16BIT565(destR, destG, destB);
		}

		dest += pitch;
		src += width+1;
	}

	lpdds->Unlock(NULL);
	drawingsurface->Unlock(NULL);

	return 0;
}

LPVOID Bitmap::GetBitmapBuffer()
{
	DDSURFACEDESC2 ddsd = { sizeof(ddsd)};
	lpdds->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);
	return ddsd.lpSurface;
}

void Bitmap::ReleaseBuffer()
{
	lpdds->Unlock(NULL);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -