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

📄 cbitmap.cpp

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 CPP
字号:
/*____________________________________________________________________________
		Copyright (C) 2002 PGP Corporation
        All rights reserved.

        $Id: CBitmap.cpp,v 1.2 2002/08/06 20:10:45 dallen Exp $
____________________________________________________________________________*/

#include "pgpClassesConfig.h"

#include "UMath.h"
#include "CBitmap.h"
#include "CDC.h"
#include "CPalette.h"
#include "CRect.h"

_USING_PGP

// Class CBitmap member functions

CBitmap& 
CBitmap::operator=(HBITMAP bitmap)
{
	Attach(bitmap);
	return *this;
}

void 
CBitmap::PaintWithPalette(HDC dc, HPALETTE palette, CPoint origin) const
{
	pgpAssert(IsAttached());

	CDC	cdc(dc);

	if (IsntNull(palette))
	{
		cdc.SelectPalette(palette, FALSE);
		cdc.RealizePalette();
	}

	CDC	memDC;

	memDC.CreateCompatible(cdc);

	if (IsntNull(palette))
	{
		memDC.SelectPalette(palette, FALSE);
		memDC.RealizePalette();
	}

	HBITMAP	oldBitmap	= memDC.SelectObject(mBitmap);

	memDC.BitBlt(cdc, origin.X(), origin.Y(), origin.X() + mWidth, 
		origin.Y() + mHeight, 0, 0, SRCCOPY);

	memDC.SelectObject(oldBitmap);
	memDC.Clear();
}

void 
CBitmap::CreateCompatible(HDC hDC, PGPInt32 width, PGPInt32 height)
{
	Clear();
	mBitmap	= CreateCompatibleBitmap(hDC, width, height);

	if (IsNull(mBitmap))
		THROW_ERRORS(kPGPError_GraphicsOpFailed, GetLastError());

	mWeCreated = TRUE;
}

void 
CBitmap::CreateWithPalette(HINSTANCE instance, const char *name, CPalette& palette)
{
	Clear();

	HRSRC	rsrcBitmap	= FindResource(instance, name, RT_BITMAP);

	if (IsNull(rsrcBitmap))
		THROW_ERRORS(kPGPError_GraphicsOpFailed, GetLastError());

	HGLOBAL	hBitmap	= LoadResource(instance, rsrcBitmap);

	if (IsNull(hBitmap))
		THROW_ERRORS(kPGPError_GraphicsOpFailed, GetLastError());

	try
	{
		BITMAPINFO	*pBMI	= reinterpret_cast<BITMAPINFO *>(
			LockResource(hBitmap));

		if (IsNull(pBMI))
			THROW_PGPERROR(kPGPError_GraphicsOpFailed);

		try
		{
			BITMAPINFOHEADER	*pBMIH	= 
				reinterpret_cast<BITMAPINFOHEADER *>(pBMI);

			CDC	dc;
			dc.AttachFromWindow(NULL);

			PGPUInt32	numColors;
			palette.CreateDIB(pBMI, numColors);

			if (IsntNull(palette.Get()))
			{
				dc.SelectPalette(palette, FALSE);
				dc.RealizePalette();
			}

			mBitmap = CreateDIBitmap(dc, pBMIH, CBM_INIT, 
				reinterpret_cast<PGPByte *>(pBMIH) + pBMIH->biSize + 
				numColors * sizeof(RGBQUAD), 
				reinterpret_cast<BITMAPINFO *>(pBMIH), DIB_RGB_COLORS);

			if (IsNull(mBitmap))
				THROW_ERRORS(kPGPError_GraphicsOpFailed, GetLastError());

			mWidth = pBMIH->biWidth;
			mHeight = pBMIH->biHeight;

			dc.Clear();
			UnlockResource(hBitmap);
		}
		catch (CComboError&)
		{
			UnlockResource(hBitmap);
			throw;
		}

		FreeResource(hBitmap);
	}
	catch (CComboError&)
	{
		FreeResource(hBitmap);
		throw;
	}

	mWeCreated = TRUE;
}

void 
CBitmap::Load(HINSTANCE instance, const char *name, PGPBoolean shared)
{
	Clear();

	mBitmap = static_cast<HBITMAP>(
		LoadImage(instance, name, IMAGE_BITMAP, 0, 0, 
		shared ? LR_SHARED : 0));
	
	if (IsNull(mBitmap))
		THROW_ERRORS(kPGPError_GraphicsOpFailed, GetLastError());

	mWeCreated = TRUE;
}

void 
CBitmap::Attach(HBITMAP bitmap)
{
	if (mBitmap == bitmap)
		return;

	Clear();

	mWeCreated = FALSE;
	mBitmap = bitmap;
}

void 
CBitmap::Clear()
{
	if (WeCreated())
		DeleteObject(mBitmap);

	mWeCreated = FALSE;
	mBitmap = NULL;
}

HBITMAP 
CBitmap::Release()
{
	HBITMAP	oldBitmap	= mBitmap;

	mWeCreated = FALSE;
	mBitmap = NULL;
	
	return oldBitmap;
}

⌨️ 快捷键说明

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