- // 打开图像文件并显示
- BOOL LoadPicture(char * lpFilePath, HWND hwnd)
- {
- // 文件句柄
- HANDLE FileHandle;
- // 高位数据、低位数据
- DWORD SizeH,SizeL,ReadCount;
- IStream * pstream=NULL;
- IPicture * pPic=NULL;
- // 以读的方式打开图像
- FileHandle=CreateFile(lpFilePath,
- GENERIC_READ,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,NULL
- );
- // 打开失败
- if(FileHandle==INVALID_HANDLE_VALUE)
- return FALSE;
- // 获取图像文件大小
- SizeL=GetFileSize(FileHandle,&SizeH);
- // 为图像文件
- // 分配一个可移动的全局的堆内存
- HGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, SizeL);
- // 分配对内存失败
- if(pBuffer==NULL)
- {
- CloseHandle(FileHandle);
- return FALSE;
- }
- // 指向堆内存的指针转换为通用的指针类型相当于解锁
- LPVOID pDes =GlobalLock(pBuffer);
- // 读入数据进堆内存
- if(ReadFile(FileHandle,pDes,SizeL,&ReadCount,NULL)==0)
- {
- CloseHandle(FileHandle);
- GlobalUnlock(pBuffer);
- free(pBuffer);
- return FALSE;
- }
- // 堆内存上锁
- GlobalUnlock(pBuffer);
- // 在全局存储器的堆中分配一个流对象
- if(CreateStreamOnHGlobal(pBuffer,true,&pstream)!=S_OK)
- {
- CloseHandle(FileHandle);
- free(pBuffer);
- return FALSE;
- }
- // 创建一个新的图像并初始化
- if(!SUCCEEDED(OleLoadPicture(pstream,SizeL,true,IID_IPicture,(void**)&pPic)))
- {
- MessageBox(0,"Call OleLoadPicture Fail","Error",0);
- return FALSE;
- }
- // 获取句柄
- // HWND hwnd=GetDlgItem(MainHwnd,PID_PICTURE);
- // 创建画布
- HDC hdc= GetDC(hwnd);
- // 高和宽
- long hmWidth;
- long hmHeight;
- // 从IPicture中获取高度与宽度
- pPic->get_Width(&hmWidth);
- pPic->get_Height(&hmHeight);
- //
- int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), 2540);
- int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), 2540);
- //
- //SetWindowPos(hwnd, HWND_TOP, 0,0,nWidth/2,nHeight/2,SWP_FRAMECHANGED);
- if (nWidth<600 && nHeight <600)
- //MoveWindow(hwnd, (600-nWidth)/2,(600-nHeight)/2, nWidth, nHeight, FALSE);
- SetWindowPos(hwnd, HWND_TOP,(600-nWidth)/2,(600-nHeight)/2, nWidth, nHeight,SWP_FRAMECHANGED);
- else
- {
- int large = nWidth>nHeight?nWidth:nHeight;
- float k = 600;
- float x = k/(large*1.0);
- int newx = (int)(x*nWidth);
- int newy = (int)(x*nHeight);
- SetWindowPos(hwnd, HWND_BOTTOM, 1,50, newx,newy, SWP_FRAMECHANGED);
- }
- RECT rc;
- GetClientRect(hwnd, &rc);
- pPic->Render(hdc, 0, 0, rc.right-rc.left,rc.bottom-rc.top, 0,hmHeight, hmWidth,-hmHeight, NULL);
- // TransparentBlt(0,0, 0, rc.right-rc.left, rc.bottom-rc.top, hDC, 0, 0, nWidth, nHeight, RGB(255, 255, 255));
- // 释放空间
- pPic->Release();
- pstream->Release();
- ReleaseDC(hwnd,hdc);
- CloseHandle(FileHandle);
- }