IPicture接口管理一個圖片對象和它的屬性。圖片對象提供對Bitmap Icon Metafile的語言不相關的抽象支持。圖像對象的主要接口是IPicture和IPictureDisp。IPictureDisp從IDispatch繼承,提供了通過自動化訪問圖片屬性的能力。圖片對象可通過OleCreatePictureIndirect創(chuàng)建。關于IPicture支持的其他接口和方法可以看MSDN,一般創(chuàng)建圖片對象可以用OleLoadPicture函數(shù),它簡化了基于流內(nèi)容創(chuàng)建圖片對象。下面的代碼中有兩個未定義的變量是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)存,準備讀入圖片文件的數(shù)據(jù)
//GlobalAlloc從堆分配指定字節(jié)的內(nèi)存區(qū)域
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);
//GlobalLock函數(shù)鎖住一個全局的內(nèi)存對象同時返回一個指向對象首字節(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)存當中

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是外部傳入的畫圖設備
long hmWidth;
long hmHeight;
gpPicture->get_Width(&hmWidth);
gpPicture->get_Height(&hmHeight);
//轉換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);