新建一个基于对话框的工程。
给你的对话框中加入一个静态文本控件(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方向。 成员函数描述:CPicture::CPicture();
说明:构造函数。构造一个空的CPicture对象。
BOOL CPicture::LoadPicture(UINT nResource, LPCTSTR lpszResType);
BOOL CPicture::LoadPicture(LPCTSTR lpszResource,LPCTSTR lpszResType);
说明:该函数从资源是加载一个图像,如果该对象已经包含一个图像,则原图像先被自动释放,而不论本次加载是否成功。
返回值:如果加载成功则返回TRUE,否则返回FALSE。 参数:
nResource 指定一个资源的ID号,该ID指定一个资源,函数将根据该资源来生成图像,资源的格式不用担心,对象会自动识别的(如果不认识该资源的格式自然加载就会失败)。 lpszResType 指定该资源的类型,国为该函数可以识别多种非标准的图像资源所以你应该指明你加载的该资源的类型
lpszResource 指定一个资源的标识符,该标识指定一个资源,函数将根据该资源来生成图像,资源的格式不用担心,对象会自动识别的(如果不认识该资源的格式自然加载就会失败)。
BOOL CPicture::LoadPictureFromFile(LPCTSTR lpszFileName); 说明:该函数从文件中加载一个图像。
返回值:如果加载成功则返回TRUE,否则返回FALSE。 参数:
lpszFileName 一个指向文件名字符串的指针。 BOOL CPicture::IsValid(); 说明:判断对象是否有效。
返回值:如果对象中有一个有效的图像则返回TRUE,否则返回FALSE。 参数:无
CSize CPicture::GetSize(); 说明:取得图象的尺寸
返回值:一个CSize对象,包含了图像的尺寸,对一个无效的CPicture对象使用该函数将返回(0,0)。
void CPicture::Draw(CDC* pDC, LPCRECT lprcDest, LPCRECT lprcSrc); void CPicture::Draw(CDC* pDC, int xDest,int yDest, int cxDest, int cyDest , int xSrc ,int ySrc ,int cxSrc ,int cySrc); 说明:在一个DC表面绘制对象内包含的图像,如果对象没有包含任何图象,则什么也不做。 返回值:无返回值。 参数:
pDC 一个指向DC对象的指针,图像将绘制在该设备表面。
lprcDest 指定一个目标矩形。源矩形内的部分图像被拉伸并绘制到设备表面的该象区域内
lprcSrc 指定一个源矩形区域。图像中位于源矩形内的部分被拉伸并绘制到设备表面目标矩形区域
xDest 指定目标矩形左上角的水平方向(X)坐标,见参数lprcDest的说明。 yDest 指定目标矩形左上角的垂直方向(Y)坐标,见参数lprcDest的说明。 cxDest 指定目标矩形的水平方向尺寸(宽度),见参数lprcDest的说明。 cyDest 指定目标矩形的垂直方向尺寸(高度),见参数lprcDest的说明。 xSrc 指定源矩形左上角的水平方向(X)坐标,见参数lprcSrc的说明。 ySrc 指定源矩形左上角的垂直方向(Y)坐标,见参数lprcSrc的说明。 cxSrc 指定源矩形的水平方向尺寸(宽度),见参数lprcSrc的说明。 cySrc 指定源矩形的垂直方向尺寸(高度),见参数lprcSrc的说明。 void CPicture::Release();
说明:将对象所包含的图像从内存中移除。注意对象本身并不会从内存中移除。你仍然可以用它来重新加载一个新的图像。你无须时刻记着为不再使用的图像调用Release,当类析构时,该函数自然被调用。当然我并不反对你显式地调用该函数来释放图像以便空出一点内存资源。
返回值:无。 参数:无。
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: krh2001.lpfdiyvbb@163.com
//
#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)); }