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

📄 dib.cpp

📁 本书分为五个部分
💻 CPP
字号:
// Dib.cpp : 实现文件
//

#include "stdafx.h"
#include "Dib.h"
#include "S09_03.h"


// CDib

CDib::CDib()
{
	m_pBMI = NULL;
	m_pDIBData = NULL;
}

CDib::~CDib()
{
	// 释放内存
	if (m_pBMI != NULL)
		delete m_pBMI;

	if (m_pDIBData != NULL)
		delete m_pDIBData;
}


// CDib 成员函数
BOOL CDib::LoadFromFile(LPCTSTR lpszFileName)
{
	CFile	file;
	BITMAPINFO* pBMI = NULL;
	BYTE* pDIBData = NULL;
	
	// 打开指定的文件
	if ( !file.Open(lpszFileName, CFile::modeRead | CFile::typeBinary) )
	{
		AfxMessageBox("打不开文件!");
		return FALSE;
	}

	// 读入BMP文件头信息
	BITMAPFILEHEADER	bfh;
	if ( file.Read(&bfh, sizeof(bfh)) != sizeof(bfh) )
	{
		AfxMessageBox("读文件出错!");
		return FALSE;
	}

	// 若不是BMP位图,不予处理
	if ( bfh.bfType != 0x4d42 )		// 'BM'
	{
		AfxMessageBox("不是BMP文件!");
		return FALSE;
	}

	// 读入位图信息头
	BITMAPINFOHEADER bih;
	if ( file.Read(&bih, sizeof(bih)) != sizeof(bih) )
	{
		AfxMessageBox("读文件出错!");
		return FALSE;
	}

	// 若不是24位真彩色位图,则不予处理
	if ( bih.biBitCount != 24 )
	{
		AfxMessageBox("不是24位真彩色位图!");
		return FALSE;
	}

	// 为BITMAPINFO结构指针申请内存,由于真彩色位图没有颜色表,所以
	// 其BITMAPINFO = BITMAPINFOHEADER
	pBMI = (BITMAPINFO*) new char[sizeof(BITMAPINFOHEADER)];
	if ( !pBMI )
	{
		AfxMessageBox("分配内存出错!");
		return FALSE;
	}
	// 由于前面已将BITMAPINFOHEADER读入了内存,所以这里只需拷贝一下
	memcpy(pBMI, &bih, sizeof(BITMAPINFOHEADER));

	// 为DIB图象数据指针申请内存
	DWORD dataBytes = bfh.bfSize - bfh.bfOffBits; // 图象数据的字节数
	pDIBData = (BYTE*) new char[dataBytes];
	if ( !pDIBData )
	{
		AfxMessageBox("分配内存出错!");
		delete pBMI;
		return FALSE;
	}

	// 读入位图的图象数据
	if ( file.Read(pDIBData, dataBytes) != dataBytes )
	{
		AfxMessageBox("读文件出错!");
		delete pBMI;
		delete pDIBData;
		return FALSE;
	}

	file.Close();

	if (m_pBMI != NULL)
		delete m_pBMI;
	m_pBMI = pBMI;

	if (m_pDIBData != NULL)
		delete m_pDIBData;
	m_pDIBData = pDIBData;

	return TRUE;
}

void CDib::ShowDIB(CDC* pDC, int nLeft, int nTop, int nWidth, int nHeight)
{
	pDC->SetStretchBltMode(COLORONCOLOR); // 设置伸缩拷贝模式

	StretchDIBits(pDC->GetSafeHdc(),    // DC的句柄 
				  nLeft,			      // 目标矩形左上角的X坐标
				  nTop,				  // 目标矩形左上角的Y坐标
				  nWidth,			  // 目标矩形的宽度
				  nHeight,		 	  // 目标矩形的高度
				  0,				      // 源矩形左上角的X坐标
				  0,				      // 源矩形左上角的Y坐标
				  GetDIBWidth(), 	  // 源矩形的宽度
				  GetDIBHeight(),	  // 源矩形的高度
				  m_pDIBData,		  // 位图图象数据的地址
				  m_pBMI,			  // 位图信息结构地址
				  DIB_RGB_COLORS,  // 标志选项
				  SRCCOPY);		  // 光栅操作码
}

⌨️ 快捷键说明

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