📄 picture.cpp
字号:
#include "stdafx.h"
#include "picture.h"
CPicture::CPicture()
{
cb=0;
m_Success=FALSE;
::AfxOleInit();
pStm=NULL;
pPic=NULL;
}
CPicture::~CPicture()
{
if(pPic!=NULL) pPic->Release();
if(pStm!=NULL) pStm->Release();
}
BOOL CPicture::LoadPicture(char filename[255])
{
CString name;
name.Format(filename);
return LoadPicture(name);
}
BOOL CPicture::LoadPicture(CString filename)
{
m_Success=FALSE;
if(pStm!=NULL)
{
pStm->Release();
pStm=NULL;
}
CFile file;
CFileStatus fstatus;
if(CFile::GetStatus(filename,fstatus)==FALSE) return FALSE;
if(fstatus.m_size<=0) return FALSE;
if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone)==FALSE) return FALSE;
cb=file.GetLength();
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData=NULL;
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)
{
file.ReadHuge(pvData,cb);
GlobalUnlock(hGlobal);
if(CreateStreamOnHGlobal(hGlobal,TRUE,&pStm)!=S_OK)
{
file.Close();
GlobalFree(hGlobal);
return FALSE;
}
}
}
else
{
file.Close();
GlobalFree(hGlobal);
return FALSE;
}
file.Close();
if(pPic!=NULL)
{
pPic->Release();
pPic=NULL;
}
if(OleLoadPicture(pStm,cb,TRUE,IID_IPicture,(LPVOID*)&pPic)==S_OK)
{
pPic->get_Type(&m_type);
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
m_width=(int)(hmWidth/26.45);
m_height=(int)(hmHeight/26.45);
}
else return FALSE;
m_Success=TRUE;
return TRUE;
}
BOOL CPicture::LoadPicture(UINT nIDResource,LPCTSTR IDType)
{
m_Success=FALSE;
if(pStm!=NULL)
{
pStm->Release();
pStm=NULL;
}
HRSRC hrSrc = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nIDResource),IDType);
HGLOBAL Global = LoadResource(AfxGetResourceHandle(), hrSrc);
LPVOID lpExe = LockResource(Global);
cb=(UINT)SizeofResource(AfxGetResourceHandle(),hrSrc);
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData=NULL;
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)
{
CopyMemory(pvData,lpExe,cb);
GlobalUnlock(hGlobal);
if(CreateStreamOnHGlobal(hGlobal,TRUE,&pStm)!=S_OK)
{
GlobalFree(hGlobal);
return FALSE;
}
}
}
else
{
GlobalFree(hGlobal);
return FALSE;
}
if(pPic!=NULL)
{
pPic->Release();
pPic=NULL;
}
if(OleLoadPicture(pStm,cb,TRUE,IID_IPicture,(LPVOID*)&pPic)==S_OK)
{
pPic->get_Type(&m_type);
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
m_width=(int)(hmWidth/26.45);
m_height=(int)(hmHeight/26.45);
}
else return FALSE;
m_Success=TRUE;
return TRUE;
}
void CPicture::DrawPicture(HDC hdc,int x,int y,int cx,int cy)
{
if(m_Success) pPic->Render(hdc,x,y,cx,cy,0,hmHeight,hmWidth,-hmHeight,NULL);
}
void CPicture::DrawRect(HDC hdc,CRect obj,CRect src)
{
if(m_Success)
pPic->Render(hdc,obj.left,obj.top,obj.Width(),obj.Height(),
(long)(src.left*26.45),
(long)(hmHeight-src.top*26.45),
(long)(src.Width()*26.45),
(long)(-src.Height()*26.45),
NULL
);
}
BOOL CPicture::SavePicture(char objname[255])
{
CString name;
name.Format(objname);
return SavePicture(name);
}
BOOL CPicture::SavePicture(CString objname)
{
if(!m_Success) return FALSE;
CFile file;
if(file.Open(objname,CFile::modeWrite|CFile::modeCreate|CFile::shareDenyNone))
{
char *pv=new char[cb+1];
ULONG pcb;
LARGE_INTEGER seek;
seek.QuadPart=-cb;
pStm->Seek(seek,STREAM_SEEK_END,NULL);
pStm->Read(pv,cb,&pcb);
file.Write(pv,pcb);
file.Close();
}
else return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -