//CDib.cpp
#include <stdafx.h>
#include"CDib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[]=__FILE__;
#endif
CDib::CDib()
{
m_palDIB=NULL;
m_hDIB=NULL;
}
CDib::~CDib()
{
DeleteDIB();
}
void CDib::DeleteDIB()
{
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL) m_hDIB);
if(m_palDIB!=NULL)
delete m_palDIB;
}
//从文件中载入DIB
BOOL CDib::Load(LPCTSTR lpszFileName)
{
HDIB hDIB;
CFile file;
CFileException fe;
if (!file.Open(lpszFileName,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
AfxMessageBox(fe.m_cause);
return FALSE;
}
TRY
{
hDIB = ::ReadDIBFile(file);
}
CATCH(CFileException,eLoad);
{
file.Abort();
return FALSE;
}
END_CATCH
DeleteDIB();//清除旧位图
m_hDIB=hDIB;
m_palDIB=new CPalette;
if(::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)
{
//DIB有可能没有调色板
delete m_palDIB;
m_palDIB=NULL;
}
return TRUE;
}
//从资源中载入DIB
BOOL CDib::LoadFromResource(UINT nID)
{
HINSTANCE hResInst=AfxGetResourceHandle();
HRSRC hFindRes;
HDIB hDIB;
LPSTR pDIB;
LPSTR pRes;
HGLOBAL hRes;
//搜寻指定的资源
hFindRes = ::FindResource(hResInst,MAKEINTRESOURCE(nID),RT_BITMAP);
if(hFindRes==NULL) return FALSE;
hRes=::LoadResource(hResInst,hFindRes);//载入位图资源
if(hRes==NULL) return FALSE;
DWORD dwSize=::SizeofResource(hResInst,hFindRes);
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwSize);
if (hDIB==NULL) return FALSE;
pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
pRes=(LPSTR)::LockResource(hRes);
memcpy(pDIB,pRes,dwSize);//把hRes中内容复制到hDIB中
::GlobalUnlock((HGLOBAL)hDIB);
DeleteDIB();
m_hDIB=hDIB;
m_palDIB=new CPalette;
if (::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)
{
//DIB可能没有调色板
delete m_palDIB;
m_palDIB=NULL;
}
return TRUE;
}
int CDib::Width()
{
if(m_hDIB==NULL) return 0;
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
int cxDIB=(int)::DIBWidth(lpDIB);//Size of DIB-x
::GlobalUnlock((HGLOBAL)m_hDIB);
return cxDIB;
}
int CDib::Height()
{
if(m_hDIB==NULL) return 0;
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
int cyDIB=(int)::DIBHeight(lpDIB);//Size of DIB-y
::GlobalUnlock((HGLOBAL)m_hDIB);
return cyDIB;
}
/*显示DIB,该函数具有缩放功能;
参数x和y说明了目的矩阵的左上角坐标,cx和cy说明了目的矩阵的尺寸;
cx和cy若有一个为0,则该函数按DIB的实际大小绘制,cx和cy的默认值是0*/
BOOL CDib::Draw(CDC *pDC,int x,int y,int cx,int cy)
{
if(m_hDIB==NULL) return FALSE;
CRect rDIB,rDest;
rDest.left=x;
rDest.top=x;
if(cx==0||cy==0)
{
cx=Width();
cy=Height();
}
rDest.right=rDest.left+cx;
rDest.bottom=rDest.top+cy;
rDIB.left=rDIB.top=0;
rDIB.right=Width();
rDIB.bottom=Height();
return ::PaintDIB(pDC->GetSafeHdc(),&rDest,m_hDIB,&rDIB,m_palDIB);
}