IPicture接口管理一個(gè)圖片對象和它的屬性,。圖片對象提供對Bitmap Icon Metafile的語言不相關(guān)的抽象支持。圖像對象的主要接口是IPicture和IPictureDisp,。IPictureDisp從IDispatch繼承,,提供了通過自動(dòng)化訪問圖片屬性的能力。圖片對象可通過OleCreatePictureIndirect創(chuàng)建,。關(guān)于IPicture支持的其他接口和方法可以看MSDN,,一般創(chuàng)建圖片對象可以用OleLoadPicture函數(shù),它簡化了基于流內(nèi)容創(chuàng)建圖片對象,。下面的代碼中有兩個(gè)未定義的變量是FilePath和hDC,。
//FilePath是從外部傳入的圖片路徑
//打開文件
HANDLE hFile = CreateFile(FilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
_ASSERTE(INVALID_HANDLE_VALUE != hFile);
//取文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL);
_ASSERTE(-1 != dwFileSize);
LPVOID pvData = NULL;
//分配內(nèi)存,準(zhǔn)備讀入圖片文件的數(shù)據(jù)
//GlobalAlloc從堆分配指定字節(jié)的內(nèi)存區(qū)域
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);
//GlobalLock函數(shù)鎖住一個(gè)全局的內(nèi)存對象同時(shí)返回一個(gè)指向?qū)ο笫鬃止?jié)的指針
pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData);
DWORD dwBytesRead = 0;
//讀取文件的數(shù)據(jù)到分配的全局內(nèi)存
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
//到此,,我們已經(jīng)把文件的數(shù)據(jù)讀到了內(nèi)存當(dāng)中
LPSTREAM pstm = NULL;
//從全局內(nèi)存創(chuàng)建IStream接口指針
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm);
//根據(jù)圖片文件創(chuàng)建IPicture接口指針
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
_ASSERTE(SUCCEEDED(hr) && gpPicture);
pstm->Release();
//至此,,IPicture接口建立好,下面開始畫圖片
//hDC是外部傳入的畫圖設(shè)備
long hmWidth;
long hmHeight;
gpPicture->get_Width(&hmWidth);
gpPicture->get_Height(&hmHeight);
//轉(zhuǎn)換himetric距離為pixels距離,,1英寸=25.4毫米
int nWidth = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), 2540);
int nHeight = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), 2540);
RECT rc;
GetClientRect(hWnd, &rc);
//IPicture::Render顯示圖片
gpPicture->Render(hDC, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, &rc);
來自: