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

📄 cbmp.cpp

📁 带滚动条的图像浏览器
💻 CPP
字号:
#include "stdafx.h"
#include "Bmp.h"
#include <memory.h> 

IMPLEMENT_DYNAMIC(CBitmapFile,CGdiObject);

CBitmapFile* CBitmapFile::FromHandle(HBITMAP hBitmap)
{ 
	return (CBitmapFile*) CGdiObject::FromHandle(hBitmap); 
}

CBitmapFile::CBitmapFile()
{

}

BOOL CBitmapFile::LoadBitmap(LPCTSTR lpszFileName)
{ 

	CFile file;
	if(!file.Open(lpszFileName,CFile::modeRead|CFile::shareDenyWrite))
	{
		MessageBox(NULL,"BMP file open error!","warning",MB_OK);
		return FALSE;
	}

	BITMAPFILEHEADER bfhHeader;
	file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
	if(bfhHeader.bfType!=((WORD) ('M'<<8)|'B'))
	{
		MessageBox(NULL,"The file is not a BMP file!","warning",MB_OK);
		return FALSE;
	}

	if(bfhHeader.bfSize!=file.GetLength())
	{
		MessageBox(NULL,"The BMP file header error!","warning",MB_OK);
		return FALSE;
	}

	UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
	LPBITMAPINFO lpBitmap=(LPBITMAPINFO) new BYTE[uBmpInfoLen];
	file.Read((LPVOID) lpBitmap,uBmpInfoLen);
	if((* (LPDWORD)(lpBitmap))!=sizeof(BITMAPINFOHEADER))
	{
		MessageBox(NULL,"The BMP is not Windows 3.0 format!","warning",MB_OK);
		return FALSE;
	}

	DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits;
	LPVOID lpBits=new BYTE[dwBitlen];
	file.ReadHuge(lpBits,dwBitlen);
	file.Close();
	BOOL bSuccess=CreateBitmapIndirect(lpBitmap, lpBits);
	delete lpBitmap;
	delete lpBits;
	if(!bSuccess)
		return FALSE;
	return TRUE;
}

BOOL CBitmapFile::CreateBitmap(int nWidth, int nHeight, UINT nBitCount, const void* lpSrcBits)
{
	ASSERT(nBitCount==1||nBitCount==4||nBitCount==8||nBitCount==16||nBitCount==24||nBitCount==32);

	LPBITMAPINFO lpBitmap;
	lpBitmap=(BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER) + 
	GetColorNumber(nBitCount) * sizeof(RGBQUAD)];
	lpBitmap->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	lpBitmap->bmiHeader.biWidth=nWidth;
	lpBitmap->bmiHeader.biHeight=nHeight;
	lpBitmap->bmiHeader.biBitCount=nBitCount;
	lpBitmap->bmiHeader.biPlanes=1;
	lpBitmap->bmiHeader.biCompression=BI_RGB;
	lpBitmap->bmiHeader.biSizeImage=0;
	lpBitmap->bmiHeader.biClrUsed=0;

	BOOL bSuccess=CreateBitmapIndirect(lpBitmap, lpSrcBits);
	delete lpBitmap;

	if(!bSuccess)
		return FALSE;
	return TRUE;
}

BOOL CBitmapFile::CreateBitmapIndirect(LPBITMAPINFO lpBitmapInfo, const void* lpSrcBits)
{
	DeleteObject();
	LPVOID lpBits;

	CDC *dc=new CDC;
	dc->CreateCompatibleDC(NULL);
	HBITMAP hBitmap=::CreateDIBSection(dc->m_hDC,lpBitmapInfo,DIB_RGB_COLORS,	&lpBits,NULL,0);
	ASSERT(hBitmap!=NULL);
	delete dc;
	Attach(hBitmap);

	BITMAP bmp;
	GetBitmap(&bmp);
	DWORD dwCount=(DWORD) bmp.bmWidthBytes * bmp.bmHeight;
	if(SetBitmapBits(dwCount,lpSrcBits)!=dwCount)
	{
		MessageBox(NULL,"DIB build error!","warning",MB_OK);
		return FALSE;
	}
	return TRUE;
}

CBitmapFile::operator HBITMAP() const
{ 
	return (HBITMAP)(this == NULL ? NULL : m_hObject); 
}

int CBitmapFile::GetBitmap(BITMAP* pBitMap)
{ 
	ASSERT(m_hObject != NULL);
	return ::GetObject(m_hObject, sizeof(BITMAP), pBitMap); 
}

int CBitmapFile::GetColorNumber(WORD wBitCount)
{
	ASSERT(wBitCount==1||wBitCount==4||wBitCount==8||wBitCount==16||wBitCount==24||wBitCount==32);
	switch(wBitCount)
	{
		case 1:
			return 2;
		case 4:
			return 16;
		case 8:
			return 256;
		default:
			return 0;
	}
}

DWORD CBitmapFile::SetBitmapBits(DWORD dwCount, const void* lpBits)
{
	if(lpBits!=NULL)
	{
		BITMAP bmp;
		GetBitmap(&bmp);
		memcpy(bmp.bmBits,lpBits,dwCount);
		return dwCount;
	}
	else 
		return 0;
}

DWORD CBitmapFile::GetBitmapBits(DWORD dwCount, LPVOID lpBits)
{
	if(lpBits!=NULL)
	{
		BITMAP bmp;
		GetBitmap(&bmp);
		memcpy(lpBits,bmp.bmBits,dwCount);
		return dwCount;
	}
	else 
		return 0;
}

CBitmapFile::~CBitmapFile()
{
	CGdiObject::DeleteObject();
}

⌨️ 快捷键说明

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