亲自改进的一个能方便显示各种类型图片的CStatic类.docx
《亲自改进的一个能方便显示各种类型图片的CStatic类.docx》由会员分享,可在线阅读,更多相关《亲自改进的一个能方便显示各种类型图片的CStatic类.docx(14页珍藏版)》请在冰豆网上搜索。
亲自改进的一个能方便显示各种类型图片的CStatic类
最近项目中要用到图片显示,有现成的不过用起来感觉不是很好.主要原因:
(一)都是读取的本地文件
(二)显示的效率不是很好 (三)不符合项目要求.于是上codeproject上找了一个类CPictureCtrl,使用很方便,但是vc6下不支持,并且不能根据图片大小调整显示大小,于是对其进行了改进.
1.源代码
CPictureCtrl.h文件:
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
//PictureCtrl.h
//
//Author:
TobiasEiseler
//
//E-Mail:
tobias.eiseler@
//
//Function:
AMFCPictureControltodisplay
// animageonaDialog,etc.
///////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
#pragmaonce
#include"afxwin.h"
#ifndefULONG_PTR
#defineULONG_PTRunsignedlong*
#endif
#include"GdiPlus.h"
usingnamespaceGdiplus;
#pragmacomment(lib,"GdiPlus.lib")//以上部分是gdi说明
classCPictureCtrl:
publicCStatic
{
public:
//Constructor
CPictureCtrl(void);
//Destructor
~CPictureCtrl(void);
public:
//Loadsanimagefromafile
BOOLLoadFromFile(CString&szFilePath);
//LoadsanimagefromanIStreaminterface
BOOLLoadFromStream(IStream*piStream);
//Loadsanimagefromabytestream;
BOOLLoadFromStream(BYTE*pData,size_tnSize);
//LoadsanimagefromaResource
// BOOLLoadFromResource(HMODULEhModule,LPCTSTRlpName,LPCTSTRlpType);
//Overload-Singleloadfunction
BOOLLoad(CString&szFilePath,intnWidth=0,intnHeight=0);
BOOLLoad(IStream*piStream,intnWidth=0,intnHeight=0);
BOOLLoad(BYTE*pData,size_tnSize,intnWidth=0,intnHeight=0);
// BOOLLoad(HMODULEhModule,LPCTSTRlpName,LPCTSTRlpType);
//Freestheimagedata
voidFreeData();
protected:
virtualvoidPreSubclassWindow();
//DrawstheControl
virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);
virtualBOOLOnEraseBkgnd(CDC*pDC);
afx_msgvoidOnPaint();
DECLARE_MESSAGE_MAP()
private:
//Internalimagestreambuffer
IStream*m_pStream;
//Controlflagifapicisloaded
BOOLm_bIsPicLoaded;
intnWidth,nHeight;
//GDIPlusToken
ULONG_PTRm_gdiplusToken;
};
CPictureCtrl.c文件
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
//PictureCtrl.cpp
//
//Author:
TobiasEiseler
//
//E-Mail:
tobias.eiseler@
//
//Function:
AMFCPictureControltodisplay
// animageonaDialog,etc.
///////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
#include"StdAfx.h"
#include"PictureCtrl.h"
//MacrotoreleaseCOMComponents
#ifdefSAFE_RELEASE
#undefSAFE_RELEASE
#endif
#defineSAFE_RELEASE(x)do{\
if((x)!
=NULL)\
{\
while((x)->Release()!
=0);\
(x)=NULL;\
}\
}while(0)
CPictureCtrl:
:
CPictureCtrl(void)
:
CStatic()
,m_pStream(NULL)
,m_bIsPicLoaded(FALSE)
,m_gdiplusToken(0)
{
GdiplusStartupInputgdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken,&gdiplusStartupInput,NULL);
}
CPictureCtrl:
:
~CPictureCtrl(void)
{
//Tidyup
FreeData();
GdiplusShutdown(m_gdiplusToken);
}
BEGIN_MESSAGE_MAP(CPictureCtrl,CStatic)
//{{AFX_MSG_MAP(CPictureCtrl)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOLCPictureCtrl:
:
LoadFromStream(IStream*piStream)
{
//Setsuccesserrorstate
SetLastError(ERROR_SUCCESS);
FreeData();
//Checkforvalidityofargument
if(piStream==NULL)
{
SetLastError(ERROR_INVALID_ADDRESS);
returnFALSE;
}
//Allocatestream
DWORDdwResult=CreateStreamOnHGlobal(NULL,TRUE,&m_pStream);
if(dwResult!
=S_OK)
{
SetLastError(dwResult);
returnFALSE;
}
//Rewindtheargumentstream
LARGE_INTEGERlInt;
lInt.QuadPart=0;
piStream->Seek(lInt,STREAM_SEEK_SET,NULL);
//Readthelenghtoftheargumentstream
STATSTGstatSTG;
dwResult=piStream->Stat(&statSTG,STATFLAG_DEFAULT);
if(dwResult!
=S_OK)
{
SetLastError(dwResult);
SAFE_RELEASE(m_pStream);
returnFALSE;
}
//Copytheargumentstreamtotheclassstream
piStream->CopyTo(m_pStream,statSTG.cbSize,NULL,NULL);
//Markasloaded
m_bIsPicLoaded=TRUE;
Invalidate();
RedrawWindow();
returnTRUE;
}
BOOLCPictureCtrl:
:
LoadFromStream(BYTE*pData,size_tnSize)
{
//Setsuccesserrorstate
SetLastError(ERROR_SUCCESS);
FreeData();
//Allocatestream
DWORDdwResult=CreateStreamOnHGlobal(NULL,TRUE,&m_pStream);
if(dwResult!
=S_OK)
{
SetLastError(dwResult);
returnFALSE;
}
//Copyargumentdatatothestream
dwResult=m_pStream->Write(pData,(ULONG)nSize,NULL);
if(dwResult!
=S_OK)
{
SetLastError(dwResult);
SAFE_RELEASE(m_pStream);
returnFALSE;
}
//Markasloaded
m_bIsPicLoaded=TRUE;
Invalidate();
RedrawWindow();
returnTRUE;
}
BOOLCPictureCtrl:
:
LoadFromFile(CString&szFilePath)
{
//Setsuccesserrorstate
SetLastError(ERROR_SUCCESS);
FreeData();
//Allocatestream
DWORDdwResult=CreateStreamOnHGlobal(NULL,TRUE,&m_pStream);
if(dwResult!
=S_OK)
{
SetLastError(dwResult);
returnFALSE;
}
//Openthespecifiedfile
CFilecFile;
CFileExceptioncFileException;
if(!
cFile.Open(szFilePath,CStdioFile:
:
modeRead|CStdioFile:
:
typeBinary,&cFileException))
{
SetLastError(cFileException.m_lOsError);
SAFE_RELEASE(m_pStream);
returnFALSE;
}
//Copythespecifiedfile'scontenttothestream
BYTEpBuffer[1024]={0};
while(UINTdwRead=cFile.Read(pBuffer,1024))
{
dwResult=m_pStream->Write(pBuffer,dwRead,NULL);
if(dwResult!
=S_OK)
{
SetLastError(dwResult);
SAFE_RELEASE(m_pStream);
cFile.Close();
returnFALSE;
}
}
//Closethefile
cFile.Close();
//MarkasLoaded
m_bIsPicLoaded=TRUE;
Invalidate();
RedrawWindow();
returnTRUE;
}
//BOOLCPictureCtrl:
:
LoadFromResource(HMODULEhModule,LPCTSTRlpName,LPCTSTRlpType)
//{
// //Setsuccesserrorstate
// SetLastError(ERROR_SUCCESS);
// FreeData();
//
// //Locatetheresource
// HRSRChResource=FindResource(hModule,lpName,lpType);
// if(hResource==NULL)
// {
// returnFALSE;
// }
//
// //Getthesizeoftheresource
// DWORDdwResourceSize=SizeofResource(hModule,hResource);
// if(dwResourceSize==0)
// {
// returnFALSE;
// }
//
// //LoadtheResource
// HGLOBALhGlobalResource=LoadResource(hModule,hResource);
// if(hGlobalResource==NULL)
// {
// returnFALSE;
// }
//
// //Locktheresourceandgetthereadpointer
// BYTE*pRecource=(BYTE*)LockResource(hGlobalResource);
// if(pRecource==NULL)
// {
// returnFALSE;
// }
//
// //AllocatetheStream
// DWORDdwResult= CreateStreamOnHGlobal(NULL,TRUE,&m_pStream);
// if(dwResult!
=S_OK)
// {
// FreeResource(hGlobalResource);
// SetLastError(dwResult);
// pRecource=NULL;
// returnFALSE;
// }
//
// //Copytheresourcedatatothestream
// dwResult=m_pStream->Write(pRecource,dwResourceSize,NULL);
// if(dwResult!
=S_OK)
// {
// FreeResource(hGlobalResource);
// SAFE_RELEASE(m_pStream);
// SetLastError(dwResult);
// returnFALSE;
// }
//
// //Tidyup
//// FreeResource(hGlobalResource);
//
// //Markasloaded
// m_bIsPicLoaded=TRUE;
//
// Invalidate();
// RedrawWindow();
//
// returnTRUE;
//}
//Overload-Singleloadfunction
BOOLCPictureCtrl:
:
Load(CString&szFilePath,intnWidth,intnHeight)
{
this->nWidth=nWidth;
this->nHeight=nHeight;
returnLoadFromFile(szFilePath);
}
BOOLCPictureCtrl:
:
Load(IStream*piStream,intnWidth,intnHeight)
{
this->nWidth=nWidth;
this->nHeight=nHeight;
returnLoadFromStream(piStream);
}
BOOLCPictureCtrl:
:
Load(BYTE*pData,size_tnSize,intnWidth,intnHeight)
{
this->nWidth=nWidth;
this->nHeight=nHeight;
returnLoadFromStream(pData,nSize);
}
//BOOLCPictureCtrl:
:
Load(HMODULEhModule,LPCTSTRlpName,LPCTSTRlpType)
//{
// returnLoadFromResource(hModule,lpName,lpType);
//}
voidCPictureCtrl:
:
FreeData()
{
m_bIsPicLoaded=FALSE;
SAFE_RELEASE(m_pStream);
}
voidCPictureCtrl:
:
PreSubclassWindow()
{
CStatic:
:
PreSubclassWindow();
ModifyStyle(0,SS_OWNERDRAW);
}
voidCPictureCtrl:
:
DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct)//只有vs才支持
{
//Checkifpicdataisloaded
if(m_bIsPicLoaded)
{
//Getcontrolmeasures
RECTrc;
this->GetClientRect(&rc);
Graphicsgraphics(lpDrawItemStruct->hDC);
Imageimage(m_pStream);
if(nHeight<=0||nWidth<=0)//图片宽度,高度不合法时,按默认处理
{
graphics.DrawImage(&image,(INT)rc.left,(INT)rc.top,(INT)(rc.right-rc.left),(INT)(rc.bottom-rc.top));
}
else//否则,计算其相对CStatic位置,并显示出来
{
intnTopDiff,nTop;
intnLeftDiff,nLeft;
nTopDiff=((rc.bottom-rc.top)-nHeight)/2;
nLeftDiff=((rc.right-rc.left)-nWidth)/2;
if(nTopDiff<=0)
{
nTop=rc.top;
nHeight=rc.bottom-rc.top;
}
else
{
nTop=rc.top+nTopDiff;
}
if(nLeftDiff<=0)
{
nLeft=rc.left;
nWidth=rc.right-rc.left;
}
else
{
nLeft=rc.left+nLeftDiff;
}
this->SetWindowPos(this,nTop,nLeft,nWidth,nHeight,SWP_SHOWWINDOW|SWP_DRAWFRAME );
graphics.DrawImage(&image,nLeft,nTop,nWidth,nHeight);
}
}
}
BOOLCPictureCtrl:
:
OnEraseBkgnd(CDC*pDC)//先于onpaint运行
{
if(m_bIsPicLoaded)
{
//Getcontrolmeasures
RECTrc;
this->GetClientRect(&rc);
Graphicsgraphics(pDC->GetSafeHdc());
LARGE_INTEGERliSeekPos;
liSeekPos.QuadPart=0;
m_pStream->Seek(liSeekPos,STREAM_SEEK_SET,NULL);
Imageimage(m_pStream);
if(nHeight<=0||nWidth<=0)//图片宽度,高度不合法时,按默认处理
{
graphics.DrawImage(&image,(INT)rc.left,(INT)rc.top,(INT)(rc.right-rc.left),(INT)(rc.bottom-rc.top));
}
else//否则,计算其相对CStatic位置,并显示出来
{
intnTopDiff,nTop;
intnLeftDiff,nLeft;
nTopDiff=((rc.bottom