IPicture接口管理一個圖片對象和它的屬性。圖片對象提供對Bitmap Icon Metafile的語言不相關的抽象支持。圖像對象的主要接口是IPicture和IPictureDisp。IPictureDisp從IDispatch繼承,提供了通過自動化訪問圖片屬性的能力。圖片對象可通過OleCreatePictureIndirect創建。關于IPicture支持的其他接口和方法可以看MSDN,一般創建圖片對象可以用OleLoadPicture函數,它簡化了基于流內容創建圖片對象。下面的代碼中有兩個未定義的變量是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;
//分配內存,準備讀入圖片文件的數據
//GlobalAlloc從堆分配指定字節的內存區域
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);
//GlobalLock函數鎖住一個全局的內存對象同時返回一個指向對象首字節的指針
pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData);
DWORD dwBytesRead = 0;
//讀取文件的數據到分配的全局內存
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
//到此,我們已經把文件的數據讀到了內存當中
LPSTREAM pstm = NULL;
//從全局內存創建IStream接口指針
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm);
//根據圖片文件創建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);