// ShowPicture.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "resource.h" #include "objbase.h" #include "iostream" #include "OCIdl.h" #include "OleCtl.h" HINSTANCE hInst; LRESULT MainDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight) ; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; HWND hDlg = NULL; hInst = hInstance; hDlg = CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG, 0,(DLGPROC)MainDlgProc); ShowWindow(hDlg, nCmdShow); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT MainDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_COMMAND: { switch ( LOWORD( wParam ) ) { case IDOK: { ShowPic("http://t1.baidu.com/it/u=3028978251,4261141105&fm=0&gp=40.jpg", hDlg, 100,100) ; } break; } } break; case WM_CLOSE: DestroyWindow(hDlg); return TRUE; break; case WM_DESTROY: PostQuitMessage(0); return TRUE; }; return FALSE;//返回FALSE给缺省对话框函数DefDlgProc(),表示没有处理本消息 } HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight) { IPicture *pPic; IStream *pStm; BOOL bResult; HANDLE hFile=NULL; DWORD dwFileSize,dwByteRead; //打开硬盘中的图形文件 hFile=CreateFile(lpstrFile,GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile!=INVALID_HANDLE_VALUE) { dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数 if (dwFileSize==0xFFFFFFFF) return E_FAIL; } else { return E_FAIL; } //分配全局存储空间 HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); LPVOID pvData = NULL; if (hGlobal == NULL) return E_FAIL; if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块 return E_FAIL; ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区 GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); //装入图形文件 bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); if(FAILED(bResult)) return E_FAIL; OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度 OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度 pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); //将图形输出到屏幕上(有点像BitBlt) HDC hDC_Temp=GetDC(hWnd); bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight, 0,hmHeight,hmWidth,-hmHeight,NULL); if ( pPic ) pPic->Release();// 释放 IPicture 指针 if ( pStm ) pStm->Release(); // 释放 IStream 指针,同时释放了 hMem CloseHandle(hFile);//关闭打开的文件 ReleaseDC( hWnd, hDC_Temp ); if (SUCCEEDED(bResult)) { return S_OK; } else { return E_FAIL; } }