загружаем
| Код | bool LoadPictFromFile(IPicture** gpPicture, const char *szFile) { bool pict_loaded; if (gpPicture) gpPicture->Release(); *gpPicture=0; pict_loaded=false;
// open file HANDLE hFile = ::CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (INVALID_HANDLE_VALUE == hFile) return false;
// get file size DWORD dwFileSize = ::GetFileSize(hFile, NULL); if ( -1 == dwFileSize ) { CloseHandle(hFile); return false; }
LPVOID pvData = NULL; // alloc memory based on file size HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwFileSize); if (NULL == hGlobal) { _ASSERTE(NULL != hGlobal); ::CloseHandle(hFile); return false; }
pvData = GlobalLock(hGlobal); if (NULL == pvData) { _ASSERTE(NULL != pvData); ::GlobalFree(hGlobal); ::CloseHandle(hFile); return false; }
DWORD dwBytesRead = 0; // read file and store in global memory BOOL bRead = ::ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); ::CloseHandle(hFile); if (FALSE == bRead || dwFileSize!=dwBytesRead) { ::GlobalUnlock(hGlobal); ::GlobalFree(hGlobal); return false; }
LPSTREAM pstm = NULL; // create IStream* from global memory HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); if (!SUCCEEDED(hr) || !pstm) { ::GlobalUnlock(hGlobal); ::GlobalFree(hGlobal); return false; }
// Create IPicture from image file hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*) gpPicture); pstm->Release(); if (!SUCCEEDED(hr) || !gpPicture) { *gpPicture=0; pict_loaded=false; } else pict_loaded=true;
::GlobalUnlock(hGlobal); ::GlobalFree(hGlobal);
return pict_loaded; }
|
Теперь, когда в объекте IPicture у нас есть загруженное изображение, то можно его вывести на экран
| Код | #define HIMETRIC_INCH 2540 #define MAP_LOGHIM_TO_PIX(x,ppli) ( ((ppli)*(x) + HIMETRIC_INCH/2) / HIMETRIC_INCH ) IPicture* gpPicture; ..... LoadPictFromFile(...........); ..... LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); if (gpPicture) { // get width and height of picture long hmWidth; long hmHeight; gpPicture->get_Width(&hmWidth); gpPicture->get_Height(&hmHeight); // convert himetric to pixels int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH); int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH); RECT rc; GetClientRect(hWnd, &rc); // display picture using IPicture::Render gpPicture->Render(hdc, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, &rc); }; EndPaint(hWnd, &ps); break; }
|
Естественно, точно также можно "отрендерить" картинку в свой DC с выбранным в нем HBITMAP |