新建一个基于对话框的工程。
给你的对话框中加入一个静态文本控件(Static Text)或者图片控件(Picture Control);
利用ClassWizard给控件关联一个变量。类型是:CPictureEx的。如:CPictureEx m_gif;当然,别忘了在你的工程中加入PictureEx.h和PictureEx.cpp文件。并在头文件中包含“PictureExcellent.h”头文件。 在OnInitDialog里加入下面代码: If(m_gif.Load("****.gif")) m_gif.Draw(); 运行你的
用途:封装了通过IPicture接口对各种常见格式的图像(如BMP、JPEG、GIF等)文件及资源的操作,在MFC的支持下工作,当然,如果你有兴趣,完全可以改成不需要MFC的支持就能工作。由于本人通常工作在MFC下,所以方便起见写成MFC的啦。 基类:无。
注:以下对图像的坐标、尺寸的单位指的都是象素,图像的坐标原点位于图像左上角向下是+Y方向,向右是+X方向。 成员函数描述:返回值:无。 参数:无。
void Release();
protected:
IPicture* m_pPic;
OLE_XSIZE_HIMETRIC _w_him; OLE_YSIZE_HIMETRIC _h_him;
CSize m_size;
protected:
void CalcSize(); };
#endif // define picture_h #endif // define PICTURE_H
//////////////////////////////////////////////////////////////////////
// Picture.cpp: implementation of the CPicture class. // Lounge Stdio 2003
// 作者:边城浪子(QQ:16168666) // E-mail: [email protected]
//////////////////////////////////////////////////////////////////////
#include "stdafx.h" #include "Picture.h"
#ifdef _DEBUG #undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
////////////////////////////////////////////////////////////////////// // Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPicture::CPicture()
:m_pPic(NULL), _h_him(0), _w_him(0), m_size(0,0)
{ }
CPicture::~CPicture() {
Release(); }
void CPicture::Release() {
if(m_pPic != NULL) {
m_pPic->Release(); m_pPic = NULL;
_h_him = _w_him = 0;
m_size.cx = m_size.cy = 0; } }
BOOL CPicture::LoadPicture(LPCTSTR lpszResource, LPCTSTR lpszResType) {
Release();
HINSTANCE hInst = AfxFindResourceHandle(lpszResource, lpszResType); HRSRC hRsrc = ::FindResource(hInst, lpszResource, lpszResType); if(hRsrc == NULL) return FALSE;
HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
if(hGlobal == NULL) return FALSE;
DWORD dwSize = SizeofResource(hInst, hRsrc);
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize); if(hMem == NULL) return FALSE;
LPVOID pSrc = ::LockResource(hGlobal); if(pSrc == NULL) { ::GlobalFree(hMem); return FALSE; }
LPVOID pDes = ::GlobalLock(hMem); if(pDes == NULL){
//::GlobalUnlock(hGlobal); ::GlobalFree(hMem); return FALSE; }
memcpy(pDes, pSrc, dwSize);
//GlobalUnlock(hGlobal); GlobalUnlock(hMem);
::FreeResource(hGlobal);
IStream* pStm = NULL;
CreateStreamOnHGlobal(hMem, TRUE, &pStm);
if(!SUCCEEDED(OleLoadPicture(pStm,dwSize,TRUE,IID_IPicture,(LPVOID*)&m_pPic))) {
pStm -> Release(); ::GlobalFree(hMem); pStm = NULL; return FALSE; }
pStm->Release(); ::GlobalFree(hMem);
CalcSize(); return TRUE; }
BOOL CPicture::LoadPictureFromFile(LPCTSTR lpszFileName) {
Release();
CFile file;
if(!file.Open(lpszFileName, CFile::modeRead)) return FALSE;
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize); if(hMem == NULL) return FALSE;
LPVOID pDes = ::GlobalLock(hMem); if(pDes == NULL){ ::GlobalFree(hMem); return FALSE; }
file.ReadHuge(pDes, dwSize);
file.Close();
GlobalUnlock(hMem);
IStream* pStm = NULL;
CreateStreamOnHGlobal(hMem, TRUE, &pStm);
if(!SUCCEEDED(OleLoadPicture(pStm,dwSize,TRUE,IID_IPicture,(LPVOID*)&m_pPic))) {
pStm -> Release(); ::GlobalFree(hMem); pStm = NULL; return FALSE; }
pStm->Release(); ::GlobalFree(hMem);
CalcSize(); return TRUE; }
void CPicture::CalcSize() {
if(m_pPic == NULL) return;
m_pPic->get_Width(&_w_him); m_pPic->get_Height(&_h_him);
CDC* pDC = CWnd::GetDesktopWindow()->GetDC(); m_size.cx = _w_him; m_size.cy = _h_him;
pDC->HIMETRICtoDP(&m_size);
CWnd::GetDesktopWindow()->ReleaseDC(pDC); }
void CPicture::Draw(CDC* pDC, LPCRECT lprcDest, LPCRECT lprcSrc) {
if(m_pPic) {
CSize szOrig(lprcSrc->left, lprcSrc->top);
CSize szSrc(lprcSrc->right - lprcSrc->left, lprcSrc->bottom - lprcSrc->top); pDC->DPtoHIMETRIC(&szOrig); pDC->DPtoHIMETRIC(&szSrc);
m_pPic->Render(*pDC, lprcDest->left,lprcDest->top,lprcDest->right-lprcDest->left, lprcDest->bottom-lprcDest->top, szOrig.cx, _h_him-szOrig.cy, szSrc.cx, -szSrc.cy, NULL); } }
void CPicture::Draw(CDC* pDC, int xDest,int yDest, int cxDest, int cyDest , int xSrc ,int ySrc ,int cxSrc ,int cySrc) {
Draw(pDC, CRect(xDest, yDest, xDest+cxDest, yDest+cyDest), CRect(xSrc, ySrc, xSrc+cxSrc, ySrc+cySrc)); }