加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

用IPicture显示图片

发布时间:2020-12-16 23:03:32 所属栏目:大数据 来源:网络整理
导读:用过 VC 的人都知道 VC 在图像显示方面不如 VB 方便,网上介绍了很多实现的方法,那些冗长的代码令许多初学者忘而却步。为此,本人将下列代码封装在一个函数中(有很强的可移值性),供各位参考。在调用 函数的时候只要给定图片的文件名、输出窗口的 HWND和

用过 VC 的人都知道 VC 在图像显示方面不如 VB 方便,网上介绍了很多实现的方法,那些冗长的代码令许多初学者忘而却步。为此,本人将下列代码封装在一个函数中(有很强的可移值性),供各位参考。在调用 函数的时候只要给定图片的文件名、输出窗口的 HWND和显示图片大小(是指实际想将图片放大或缩小后的尺寸)。

#include <ocidl.h>
#include <olectl.h>

// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸

HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
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,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)
bResult=pPic->Render(hDC_Temp,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

CloseHandle(hFile);//关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}

以上代码通过了 VC6.0 SDK 调试

作者Blog: http://blog.csdn.net/byxdaz/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读