|
MFC提供的CWnd只有默認(rèn)加載BMP文件的接口,對(duì)JPG等圖像是不支持的,而實(shí)際中經(jīng)常需要用到非BMP的圖片,在VC中加載.JPG格式的圖片,有兩種方法,用流對(duì)象加載和用IPicture接口加載。
IPicture *m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;

CString m_filename("D:\\009.jpg");//文件名

CFile m_file(m_filename,CFile::modeRead );

//獲取文件長(zhǎng)度
DWORD m_filelen = m_file.GetLength();

//在堆上分配空間
HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen);

LPVOID pvdata = NULL;
//鎖定堆空間,獲取指向堆空間的指針
pvdata = GlobalLock(m_hglobal);

//將文件數(shù)據(jù)讀區(qū)到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream* m_stream;

GlobalUnlock(m_hglobal);

//在堆中創(chuàng)建流對(duì)象
CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream);

//利用流加載圖像
OleLoadPicture(m_stream,m_filelen,TRUE,IID_IPicture,(LPVOID*)&m_picture);

m_picture->get_Width(&m_width);
m_picture->get_Height(&m_height);

CDC* dc = GetDC();

m_IsShow = TRUE;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());

m_picture->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);
以上代碼是用創(chuàng)建流文件的方式加載,也可以加載.gif圖片,但不能顯示動(dòng)畫(huà)效果。 下面的代碼則是用IPicture接口的方式來(lái)加載jpg圖片(全屏顯示圖片)。 注意:這兩段代碼不能用在wince平臺(tái)上,在wince上加載有另外的函數(shù)。
CString szFileName;
szFileName.Empty();
szFileName = "D:\\84.jpg";
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open(szFileName,CFile::modeRead) && file.GetStatus(szFileName,fstatus) && ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData =NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData,cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
}
}
}
// HRESULT Render( HDC hdc, //渲染圖像用的設(shè)備環(huán)境句柄
// long x, //在hdc上的水平坐標(biāo)
// long y, //在hdc上的垂直坐標(biāo)
// long cx, //圖像寬度
// long cy, //圖像高度
// OLE_XPOS_HIMETRIC xSrc, //在源圖像上的水平偏移
// OLE_YPOS_HIMETRIC ySrc, //在源圖像上的垂直偏移
// OLE_XSIZE_HIMETRIC cxSrc,//在源圖像上水平拷貝的數(shù)量
// OLE_YSIZE_HIMETRIC cySrc,//在源圖像上垂直拷貝的數(shù)量
// LPCRECT prcWBounds //指向目標(biāo)圖元設(shè)備環(huán)境句柄的指針);
CComQIPtr<IPicture> m_picture;
HRESULT hr = OleLoadPicture(pStm,0,false,IID_IPicture,(void**)&m_picture);
long a,b;
m_picture->get_Width(&a);
m_picture->get_Height(&b);
CSize sz(a,b);
CDC *pdc = GetDlgItem(IDC_STATIC)->GetDC();
// CDC *pdc = GetDC();
// pdc->HIMETRICtoDP(&sz);
CRect rect;
GetClientRect(rect);
// GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
m_picture->Render(*pdc,rect.left,rect.top,rect.Width(),
rect.Height(),0,b,a,-b,&rect);
也可以用GDI+把圖片轉(zhuǎn)成.bmp文件再加載,在StdAfx.h中靜態(tài)調(diào)用gdiplus.lib,即由編譯系統(tǒng)完成對(duì)DLL的加載,應(yīng)用程序結(jié)束時(shí)卸載DLL的編碼。如下: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib") #endif
2、在類(lèi)的頭文件中定義,以下成員變量,用來(lái)初始化GDI+的使用和結(jié)束使用。 GdiplusStartupInput m_gdiplusStartupInput; ULONG_PTR m_gdiplusToken;
3、在初始化函數(shù)中,初始化GDI+。如:在OnCreate()函數(shù)中加入初始化GDI+的函數(shù): GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
4、對(duì)應(yīng)的在OnDestroy()函數(shù)中加入結(jié)束GDI+使用的函數(shù): GdiplusShutdown(m_gdiplusToken);
接著,就可以使用GDI+了,要實(shí)現(xiàn)要求的內(nèi)容很容易,方法如下: 寫(xiě)一個(gè)如下的方法: HBITMAP ReturnHBITMAP(CString FileName)//FileName可能是bmp、dib、png、gif、jpeg/jpg、tiff、emf等文件的文件名 { Bitmap tempBmp(FileName.AllocSysString()) ; Color backColor; HBITMAP HBitmap; tempBmp.GetHBITMAP(backColor,&HBitmap); return HBitmap;
}
在WM5.0+VC8.0的環(huán)境下,還可以COM(組件)的方式加載圖片,這種方法能加載的圖片的格式比較全(.jpg,.png,.gif),在Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP\Win32\Imaging例子中,用這個(gè)COM可以加載皮膚,有興趣的朋友可以試一下。
|