bitmap.cpp

来自「一个小的类似于雷电的射击游戏」· C++ 代码 · 共 103 行

CPP
103
字号
#include "StdAfx.h"
#include "Bitmap.h"

//--------------------------------------------
//  构造函数
//--------------------------------------------
Bitmap::Bitmap(char *filename,
			   BOOL bTransMode = FALSE,
			   COLORREF crTransColor=RGB(255, 0, 255)):
m_hBitmap(NULL),
m_hMask(NULL),
m_iWidth(0),
m_iHeight(0),
m_bTransMode(bTransMode),
m_crTransColor(crTransColor)
{
	Load(filename);
	if(m_bTransMode)
		CreateMask();
}

//--------------------------------------------
//  释构函数
//--------------------------------------------
Bitmap::~Bitmap()
{
	DeleteObject(m_hBitmap);
}

//--------------------------------------------
//  Load()
//  载入图像文件
//--------------------------------------------
void Bitmap::Load(char *filename)
{
	DeleteObject(m_hBitmap);
	m_hBitmap = (HBITMAP)LoadImage(
		NULL,
		filename,
		IMAGE_BITMAP,
		0,
		0,
		LR_LOADFROMFILE | LR_CREATEDIBSECTION
		);
	DIBSECTION		ds;
	GetObject(m_hBitmap, sizeof(ds), &ds);
	m_iWidth = ds.dsBmih.biWidth;
	m_iHeight = ds.dsBmih.biHeight;
}

//--------------------------------------------
//  CreateMask()
//  载入图像文件
//--------------------------------------------
void Bitmap::CreateMask()
{
	m_hMask = CreateBitmap(m_iWidth, m_iHeight, 1, 1, NULL);
	HDC bmpDC = CreateCompatibleDC(0);
	HDC maskDC = CreateCompatibleDC(0);
	SelectObject(bmpDC, m_hBitmap);
	SelectObject(maskDC, m_hMask);

	SetBkColor(bmpDC, m_crTransColor);
	BitBlt(maskDC, 0, 0, m_iWidth, m_iHeight, bmpDC, 0, 0, SRCCOPY);
	SetBkColor(bmpDC, RGB(0, 0, 0));
	SetTextColor(bmpDC, RGB(255, 255, 255));
	BitBlt(bmpDC, 0, 0, m_iWidth, m_iHeight, maskDC, 0, 0, SRCAND);

	DeleteDC(bmpDC);
	DeleteDC(maskDC);
}

//--------------------------------------------
//  Draw()
//  输出到设备场景上
//--------------------------------------------
void Bitmap::Draw(HDC hDC, int dx=0, int dy=0, int dw=0, int dh=0, int sx=0, int sy=0)
{
	if (!dw)
		dw = m_iWidth;
	if (!dh)
		dh = m_iHeight;

	HDC bmpDC = CreateCompatibleDC(hDC);
	SelectObject(bmpDC, m_hBitmap);

	if (m_bTransMode)
	{
		HDC maskDC = CreateCompatibleDC(hDC);
		SelectObject(maskDC, m_hMask);

		BitBlt(hDC, dx, dy, dw, dh, maskDC, sx, sy, SRCAND);
		BitBlt(hDC, dx, dy, dw, dh, bmpDC, sx, sy, SRCPAINT);

		DeleteDC(maskDC);
	}
	else
		BitBlt(hDC, dx, dy, dw, dh, bmpDC, sx, sy, SRCCOPY);

	DeleteDC(bmpDC);
}

⌨️ 快捷键说明

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