#include <Windows.h> #include <OCIdl.h> #include <OleCtl.h> BOOL DrawPicture(char* pszFilePath,HWND hWnd,int nDrawWidth,int nDrawHeight) { HDC hDC = GetDC(hWnd); if(hDC == NULL) { return GetLastError(); } IPicture* pPic = NULL; IStream* pStream = NULL; int ret = 0; HANDLE hFile = NULL; DWORD dwFileSize = 0; DWORD dwByteRead = 0; LPVOID pvData = NULL; HGLOBAL hMem = NULL; hFile = CreateFile(pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) goto exit; dwFileSize = GetFileSize(hFile, NULL); if (dwFileSize == INVALID_FILE_SIZE) goto exit; hMem = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); if (hMem == NULL) goto exit; pvData = GlobalLock(hMem); if(!ReadFile(hFile, pvData, dwFileSize, &dwByteRead,NULL) || dwByteRead !=dwFileSize) { goto exit; } GlobalUnlock(hMem); CreateStreamOnHGlobal(hMem, TRUE, &pStream); ret = OleLoadPicture(pStream, dwFileSize, TRUE, IID_IPicture, (LPVOID*)&pPic); if(ret != S_OK) goto exit; OLE_XSIZE_HIMETRIC picWidth; OLE_YSIZE_HIMETRIC picHeight; pPic->get_Width(&picWidth); pPic->get_Height(&picHeight); ret = pPic->Render(hDC, 0, 0, nDrawWidth, nDrawHeight, 0, picHeight, picWidth, -picHeight, NULL); exit: if(hDC) { ReleaseDC(hWnd, hDC); hDC = NULL; } if(hFile) { CloseHandle(hFile); hFile = NULL; } if(pPic) { pPic->Release(); pPic = NULL; } if(pStream) { pStream->Release(); pStream = NULL; } if(hMem) { GlobalFree(hMem); hMem = NULL; } if(ret) return TRUE; else return FALSE; } LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_PAINT: { PAINTSTRUCT ps = {0}; BeginPaint(hwnd, &ps); RECT rc; GetClientRect(hwnd, &rc); DrawPicture("H:/Desktop/psu.jpg", hwnd, rc.right-rc.left, rc.bottom-rc.top); EndPaint(hwnd, &ps); return 0; } case WM_CLOSE: DestroyWindow(hwnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.hbrBackground = (HBRUSH)COLOR_WINDOW; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = "vbgk_class"; wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC; if(!RegisterClassEx(&wc)) { return 1; } CoInitialize(NULL); int cxScreen = GetSystemMetrics(SM_CXSCREEN); int cyScreen = GetSystemMetrics(SM_CYSCREEN); HWND hwnd = CreateWindowEx(0, "vbgk_class", "Pic Viewer", WS_OVERLAPPEDWINDOW, (cxScreen - 900) / 2, (cyScreen - 700) / 2, 900, 700, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { return 2; } UpdateWindow(hwnd); ShowWindow(hwnd, nShowCmd); MSG msg; BOOL bRet; while((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0) { if(bRet == -1) break; TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }