VC窗口(控件)中显示指定 URL 对应图片

在上篇 VC 中用 IPicture 在窗口中显示图片文件 讲到的是 VC 窗口(或控件)中显示本地图片文件,本文延伸这一话题,来演示如何显示网上的图片,即提供图片的 HTTP URL 地址,把它显示到 VC 的界面中来。

  本文参考我原来写的一篇日志 VC中使用CInternetSession抓取网页内容 来修改上篇代码中用来显示图片的函数:HRESULT ShowPic(char *lpstrFile,HWND hWnd)。把研究过的东西整理记下来总是好处多多,瞧,至少现在展开其他话题,可参考时便能信手拈来。

重新实现的函数 HRESULT ShowPic(char *lpstrFile,HWND hWnd) 代码如下:

***************************

// 显示图片, lpstrImgUrl 为图片URL地址,hWnd 为窗口句柄   
HRESULT Utils::ShowPic(char *lpstrImgUrl,HWND hWnd)   
{   
  HDC hDC_Temp=GetDC(hWnd);   
   
  IPicture *pPic;   
  IStream *pStm;   
   
  BOOL bResult;   
   
  DWORD dwFileSize,dwByteRead;   
   
  //读取网页上图片文件,实际是个CHttpFile指针 
  CInternetSession session("HttpClient"); 
  CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl); 
   
  if (httpFile!=INVALID_HANDLE_VALUE)   
  {   
    dwFileSize= httpFile->GetLength();//获取文件字节数   
     
    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;   
   
  //把文件读入内存缓冲区   
  dwByteRead = httpFile->Read(pvData,dwFileSize); 
   
  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);   
   
  //转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米   
  int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);   
  int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);   
   
  //将图形输出到屏幕上(有点像BitBlt)   
  bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,   
    0,hmHeight,hmWidth,-hmHeight,NULL);   
   
  pPic->Release();   
   
  httpFile->Close();//关闭打开的文件   
   
  if (SUCCEEDED(bResult))   
  {   
    return S_OK;   
  }   
  else   
  {   
    return E_FAIL;   
  }   
} 
// 显示图片, lpstrImgUrl 为图片URL地址,hWnd 为窗口句柄 
HRESULT Utils::ShowPic(char *lpstrImgUrl,HWND hWnd)  
{  
  HDC hDC_Temp=GetDC(hWnd);  
  IPicture *pPic;  
  IStream *pStm;  
  BOOL bResult;  
  DWORD dwFileSize,dwByteRead;  
  
//读取网页上图片文件,实际是个CHttpFile指针
CInternetSession session("HttpClient");
CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl);
  if (httpFile!=INVALID_HANDLE_VALUE)  
  {  
    dwFileSize= httpFile->GetLength();//获取文件字节数  
 
    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;  
  //把文件读入内存缓冲区  
  dwByteRead = httpFile->Read(pvData,dwFileSize);
  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);  
  //转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米 
  int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540); 
  int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540); 
  //将图形输出到屏幕上(有点像BitBlt)  
  bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,  
    0,hmHeight,hmWidth,-hmHeight,NULL);  
  pPic->Release();  
  httpFile->Close();//关闭打开的文件  
  if (SUCCEEDED(bResult))  
  {  
    return S_OK;  
  }  
  else  
  {  
    return E_FAIL;  
  }  
} 

*********************************************************

代码说明:与上篇 VC 中用 IPicture 在窗口中显示图片文件 中函数HRESULT ShowPic(char *lpstrFile,HWND hWnd) 的比较

  1. 参数 lpstrFile 改为了 lpstrImgUrl,切合实际,这里是传入的一个网上图片的 URL 地址

  2. 得到文件的句柄不是通过 CreateFile 函数,而是改为了用 CInternetSession 网络读取,得到的是一个 httpFile

  CInternetSession session("HttpClient"); 

  CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl);

  3. 获取文件的大小方式有变,GetFileSize() 改为用 CFile 的 GetLength()

  4. 把文件读入缓冲区的方式也变了,不使用 Windows API 函数 ReadFile(),而是直接调用 CFile 的 Read()函数。

  其余都一样的。把这个函数替换上一篇的同名函数,给它传递图片的 URL,将会在窗口中显示出对应图片来,尚不支持 GIF 动画,只显示第一帧,完整代码不在此列出,朋友们根据实际实现自己的需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值