亲自改进的一个能方便显示各种类型图片的CStatic类.docx

上传人:b****8 文档编号:10330071 上传时间:2023-02-10 格式:DOCX 页数:14 大小:18.13KB
下载 相关 举报
亲自改进的一个能方便显示各种类型图片的CStatic类.docx_第1页
第1页 / 共14页
亲自改进的一个能方便显示各种类型图片的CStatic类.docx_第2页
第2页 / 共14页
亲自改进的一个能方便显示各种类型图片的CStatic类.docx_第3页
第3页 / 共14页
亲自改进的一个能方便显示各种类型图片的CStatic类.docx_第4页
第4页 / 共14页
亲自改进的一个能方便显示各种类型图片的CStatic类.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

亲自改进的一个能方便显示各种类型图片的CStatic类.docx

《亲自改进的一个能方便显示各种类型图片的CStatic类.docx》由会员分享,可在线阅读,更多相关《亲自改进的一个能方便显示各种类型图片的CStatic类.docx(14页珍藏版)》请在冰豆网上搜索。

亲自改进的一个能方便显示各种类型图片的CStatic类.docx

亲自改进的一个能方便显示各种类型图片的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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1