📄 jnimage.cpp
字号:
// JnImage.cpp: implementation of the CJnImage class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Prog.h"
#include "JnImage.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CJnImage::CJnImage()
{
m_nPos=-1; //说明不使用相应的图像数组序列
pImage=NULL;
m_nType=JnImageNull;
m_bAutoDelete=FALSE;
}
CJnImage::~CJnImage()
{
Free();
}
BOOL CJnImage::SetImage(CPicture *pic) //外部直接传来该对象,则该对象必须由外部释放
{
Free();
if(pic)
{
pImage=(void*)pic;
m_nType=JnImageCPicture;
m_bAutoDelete=FALSE;
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(LPCTSTR lpPath)
{
Free();
CPicture* p=new CPicture; //创建一个图像指针
if(p->Load(lpPath)) //根据文件名读取图像
{ //如果读取成功就设置图像指针
m_nType=JnImageCPicture;
pImage=(void*)p;
m_bAutoDelete=TRUE;
}
else //如果读取图像失败,就返回
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(CArchive &ar)
{
Free();
CPicture* p=new CPicture; //创建一个图像指针
if(p->Load(ar)) //根据文件名读取图像
{ //如果读取成功就设置图像指针
m_nType=JnImageCPicture;
pImage=(void*)p;
m_bAutoDelete=TRUE;
}
else //如果读取图像失败,就返回
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(IStream *pstm)
{
Free();
CPicture* p=new CPicture; //创建一个图像指针
if(p->Load(pstm)) //根据文件名读取图像
{ //如果读取成功就设置图像指针
m_nType=JnImageCPicture;
pImage=(void*)p;
m_bAutoDelete=TRUE;
}
else //如果读取图像失败,就返回
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(UINT nIDRes)
{
Free();
CPicture* p=new CPicture; //创建一个图像指针
if(p->Load(nIDRes)) //如果正确地读出了图像
{
m_nType=JnImageCPicture;
pImage=(void*)p;
m_bAutoDelete=TRUE;
}
else
{
delete p;
CDIBitmap* p1=new CDIBitmap;
if(p1->Load(nIDRes))
{
m_nType=JnImageCDIBitmap;
pImage=(void*)p1;
m_bAutoDelete=TRUE;
}
else
{
return FALSE;
}
}
return TRUE;
}
BOOL CJnImage::SetImage(BYTE *lpSrc, DWORD len)
{
Free();
CPicture* p=new CPicture; //创建一个图像指针
if(p->Load(lpSrc,len)) //如果正确地读出了图像
{
m_nType=JnImageCPicture;
pImage=(void*)p;
m_bAutoDelete=TRUE;
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(CDIBitmap *pbmp)
{
Free();
if(pbmp)
{
pImage=(void*)pbmp;
m_nType=JnImageCBitmap;
m_bAutoDelete=FALSE;
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(CImageList *pList, int nPos)
{
Free();
if(pList)
{
pImage=(void*)pList;
m_nType=JnImageCImageList;
m_bAutoDelete=FALSE;
m_nPos=nPos;
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CJnImage::SetImage(CBitmap *pbmp)
{
Free();
if(pbmp)
{
pImage=(void*)pbmp;
m_nType=JnImageCBitmap;
m_bAutoDelete=FALSE;
}
else
{
return FALSE;
}
return TRUE;
}
void CJnImage::Draw(CDC *pDC, CRect rc)
{
if(pImage)
{
switch(m_nType)
{
case JnImageNull:
break;
case JnImageCBitmap:
{
CBitmap* p=(CBitmap*)pImage;
CBitmap* pOldBitmap=NULL;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC); ///建立与显示设备兼容的内存设备场境
pOldBitmap=MemDC.SelectObject(p); ///将位图选入内存场境
pDC->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),&MemDC,0,0,SRCCOPY); ///显示它
MemDC.SelectObject(pOldBitmap);
}
break;
case JnImageCImageList:
{
CImageList* p=(CImageList*)pImage;
p->Draw(pDC,m_nPos,rc.TopLeft(),ILD_NORMAL);
}
break;
case JnImageCDIBitmap:
{
CDIBitmap* p=(CDIBitmap*)pImage;
p->DrawDIB(pDC,rc.left,rc.top);
}
break;
case JnImageCPicture:
{
CPicture* p=(CPicture*)pImage;
p->Render(pDC,rc);
}
break;
case JnImageGif:
break;
case JnImageFlash:
break;
}
}
}
void CJnImage::Free()
{
//如果系统中占用了资源,就需要自行将这些资源释放掉
if(m_bAutoDelete && pImage)
{
switch(m_nType)
{
case JnImageNull:
break;
case JnImageCBitmap:
{
CBitmap* p=(CBitmap*)pImage;
p->DeleteObject();
delete p;
}
break;
case JnImageCImageList:
{
CImageList* p=(CImageList*)pImage;
p->DeleteImageList();
delete p;
}
break;
case JnImageCDIBitmap:
{
CDIBitmap* p=(CDIBitmap*)pImage;
p->Free();
delete p;
}
break;
case JnImageCPicture:
{
CPicture* p=(CPicture*)pImage;
p->Free();
delete p;
}
break;
case JnImageGif:
break;
case JnImageFlash:
break;
}
pImage=NULL;
m_nType=JnImageNull;
m_nPos=-1;
m_bAutoDelete=FALSE;
}
}
CSize CJnImage::GetSize()
{
CSize size(0,0);
if(pImage)
{
switch(m_nType)
{
case JnImageCBitmap:
{
CBitmap* p=(CBitmap*)pImage;
size=p->GetBitmapDimension();
}
break;
case JnImageCImageList:
{
CImageList* p=(CImageList*)pImage;
IMAGEINFO Info;
p->GetImageInfo(m_nPos,&Info);
size=CSize(Info.rcImage.right-Info.rcImage.left+1,Info.rcImage.bottom-Info.rcImage.top+1);
}
break;
case JnImageCDIBitmap:
{
CDIBitmap* p=(CDIBitmap*)pImage;
size=CSize(p->GetWidth(),p->GetHeight());
}
break;
case JnImageCPicture:
{
CPicture* p=(CPicture*)pImage;
size=p->GetImageSize();
}
break;
}
}
return size;
}
CJnImage& CJnImage::operator=(CJnImage& img)
{
//在创建新图像之前先要析构自身的图像内容
Free();
m_bAutoDelete=FALSE;
m_nPos=img.m_nPos;
m_nType=img.m_nType;
pImage=img.pImage;
return *this;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -