VC 中用 IPicture 在窗口中显示图片文件
来源:互联网 发布:淘宝收费的课程靠谱吗 编辑:程序博客网 时间:2024/05/18 22:40
- #include <windows.h> // Windows SDK 要用到的
- #include <commdlg.h> // 打开文件的窗口要包含这个头文件
-
- #include <ocidl.h>
- #include <olectl.h>
-
- LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);
-
- HRESULT ShowPic(char *lpstrFile,HWND hWnd) ;
-
- char lpstrFile[MAX_PATH]="";
-
-
- int WINAPI WinMain (HINSTANCE hThisInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpszArgument,
- int nFunsterStil)
-
- {
-
- char szClassName[ ] = "ShowPicture";
-
- WNDCLASSEX windclass;
-
-
- windclass.cbSize = sizeof(windclass);
- windclass.hInstance = hThisInstance;
- windclass.lpszClassName = szClassName;
- windclass.lpfnWndProc = MainWndProc;
- windclass.style = CS_DBLCLKS;
- windclass.cbSize = sizeof (WNDCLASSEX);
-
- windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
- windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
- windclass.hCursor = LoadCursor (NULL, IDC_ARROW);
- windclass.lpszMenuName = NULL;
- windclass.cbClsExtra = 0;
- windclass.cbWndExtra = 0;
-
- windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
-
-
- if (!RegisterClassEx (&windclass))
- return 0;
-
-
- HWND hWnd = CreateWindowEx (
- 0,
- szClassName,
- "显示图片 -- 鼠标双击浏览图片文件 -- Author:Unmi",
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- 640,
- 480,
- HWND_DESKTOP,
- NULL,
- hThisInstance,
- NULL
- );
-
-
- ShowWindow (hWnd, nFunsterStil);
-
-
-
- MSG messages;
- while (GetMessage (&messages, NULL, 0, 0))
- {
-
- TranslateMessage(&messages);
-
-
- DispatchMessage(&messages);
- }
-
-
- return messages.wParam;
- }
-
-
- LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_DESTROY:
-
- PostQuitMessage (0);
- break;
- case WM_LBUTTONDBLCLK:
- {
- OPENFILENAME file = {0};
- file.lStructSize = sizeof(file);
- file.lpstrTitle = "请选择一个图片文件";
- file.lpstrFile = lpstrFile;
- file.nMaxFile = MAX_PATH;
- file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)/0*.jpg;*.gif;*.bmp/0/0";
- if(::GetOpenFileName(&file))
- {
-
- HDC hdc=GetDC(hWnd);
- RECT rect;
- ::GetWindowRect(hWnd,&rect);
- ::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND);
-
- ::SendMessage(hWnd,WM_PAINT,NULL,NULL);
- }
- }
- break;
- case WM_PAINT:
- ShowPic(lpstrFile,hWnd);
- break;
- default:
-
-
- return DefWindowProc (hWnd, message, wParam, lParam);
- }
-
- return 0;
- }
-
- HRESULT ShowPic(char *lpstrFile,HWND hWnd)
- {
- HDC hDC_Temp=GetDC(hWnd);
-
- 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);
-
-
- int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
- int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
-
-
- bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,
- 0,hmHeight,hmWidth,-hmHeight,NULL);
-
- pPic->Release();
-
- CloseHandle(hFile);
-
- if (SUCCEEDED(bResult))
- {
- return S_OK;
- }
- else
- {
- return E_FAIL;
- }
- }