📄 cdib.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 + -