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

📄 cdib.cpp

📁 用算法来实现一个收费系统
💻 CPP
字号:
#include "stdafx.h"
#include "LaneSoftDoc.h"
#include "LaneSoftView.h"
#include "CDIB.h"
extern CLaneSoftView * m_pMainView;

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

CDIB::~CDIB()
{
	if(m_pBMI != NULL)
		delete m_pBMI;
	if(m_pDIBData != NULL)
		delete m_pDIBData;
}

BOOL CDIB::LoadFromFile(LPCTSTR lpszFileName)
{
	CFile file;
	BITMAPINFO * pBMI = NULL;
	BYTE * pDIBData = NULL;

	if(!file.Open(lpszFileName,CFile::modeRead|CFile::typeBinary))
	{
		AfxMessageBox("无法打开文件");
		return FALSE;
	}

	BITMAPFILEHEADER bfh;
	if(file.Read(&bfh,sizeof(bfh)) != sizeof(bfh))
	{
		AfxMessageBox("读文件出错");
		return FALSE;
	}
	
	if(bfh.bfType != 0x4d42)
	{
		AfxMessageBox("不是BMP文件");
		return FALSE;
	}
	BITMAPINFOHEADER bih;

	if(file.Read(&bih,sizeof(bih)) != sizeof(bih))
	{
		AfxMessageBox("读文件出错");
		return FALSE;
	}

	if( bih.biBitCount != 24 )
	{
		AfxMessageBox("不是24位真彩色位图");
		return FALSE;
	}

	pBMI = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
	if(!pBMI)
	{
		AfxMessageBox("分配内存出错");
	    return FALSE;
	}
	memcpy(pBMI,&bih,sizeof(BITMAPINFOHEADER));

	DWORD dataBytes = bfh.bfSize - bfh.bfOffBits;
	pDIBData = (BYTE *)new char[dataBytes];
	if(!pDIBData)
	{
		AfxMessageBox("分配内存出错");
		delete pBMI;
		delete pDIBData;
		return FALSE;
	}
	if(file.ReadHuge(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;
	m_pDIBOffset = m_pDIBData + bfh.bfOffBits - sizeof(BITMAPINFOHEADER)
		         -sizeof(BITMAPFILEHEADER);
	


	return TRUE;

}

void CDIB::ShowDIB(CDC *pDC,int nLeft,int nTop,int nWidth,int nHeight)
{
	pDC->SetStretchBltMode(COLORONCOLOR);
	StretchDIBits(pDC->GetSafeHdc(),nLeft,nTop,nWidth,nHeight,
		          0,0,GetDIBWidth(),GetDIBHeight(),
				  m_pDIBOffset,m_pBMI,DIB_RGB_COLORS,SRCCOPY);

}
void CDIB::PasteDIB(CDC *pDC,int nLeft,int nTop,int nWidth,int nHeight)
{
	BYTE * pDIBData = NULL;
	DWORD dataBytes = GetDIBWidth() * GetDIBHeight() * 3l;
	pDIBData = (BYTE *)new char[dataBytes];
	if(!pDIBData)
	{
		AfxMessageBox("分配内存出错");
		return ;
	}
	DWORD i;
	for(i = 0 ; i < dataBytes ; i++)
	{
		if(m_pDIBOffset[i] == 0xff)
			pDIBData[i] = 0;
		else
			pDIBData[i] = m_pDIBOffset[i];
	}

	m_pMainView->m_pFrameDlg->m_Video_Win.SendMessage(WM_START_VIDEO,1,0);
	pDC->SetStretchBltMode(COLORONCOLOR);
	StretchDIBits(pDC->GetSafeHdc(),nLeft,nTop,nWidth,nHeight,
		          0,0,GetDIBWidth(),GetDIBHeight(),
				  pDIBData,m_pBMI,DIB_RGB_COLORS,SRCPAINT );
	StretchDIBits(pDC->GetSafeHdc(),nLeft,nTop,nWidth,nHeight,
		          0,0,GetDIBWidth(),GetDIBHeight(),
				  m_pDIBOffset,m_pBMI,DIB_RGB_COLORS,SRCAND);
	m_pMainView->m_pFrameDlg->m_Video_Win.SendMessage(WM_START_VIDEO,0,0);

	delete [] pDIBData;

}
void CDIB::PasteDIB1(CDC *pDC,int nLeft,int nTop,int nWidth,int nHeight)
{
	BYTE * pDIBData = NULL;
	DWORD dataBytes = GetDIBWidth() * GetDIBHeight() * 3l;
	pDIBData = (BYTE *)new char[dataBytes];
	if(!pDIBData)
	{
		AfxMessageBox("分配内存出错");
		return ;
	}
	DWORD i;
	for(i = 0 ; i < dataBytes ; i++)
	{
		if(m_pDIBOffset[i] == 0xff)
			pDIBData[i] = 0;
		else
			pDIBData[i] = m_pDIBOffset[i];
	}

	StretchDIBits(pDC->GetSafeHdc(),nLeft,nTop,nWidth,nHeight,
		          0,0,GetDIBWidth(),GetDIBHeight(),
				  pDIBData,m_pBMI,DIB_RGB_COLORS,SRCPAINT );

	pDC->SetStretchBltMode(COLORONCOLOR);
	StretchDIBits(pDC->GetSafeHdc(),nLeft,nTop,nWidth,nHeight,
		          0,0,GetDIBWidth(),GetDIBHeight(),
				  m_pDIBOffset,m_pBMI,DIB_RGB_COLORS,SRCAND);

	delete [] pDIBData;
}


⌨️ 快捷键说明

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