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

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

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

重新实现的函数 HRESULT ShowPic(char *lpstrFile,HWND hWnd) 代码如下:
 1// 显示图片, lpstrImgUrl 为图片URL地址,hWnd 为窗口句柄
 2HRESULT Utils::ShowPic(char *lpstrImgUrl,HWND hWnd)
 3{
 4    HDC hDC_Temp=GetDC(hWnd);
 5
 6    IPicture *pPic;
 7    IStream *pStm;
 8
 9    BOOL bResult;
10
11    DWORD dwFileSize,dwByteRead;
12
13    //读取网页上图片文件,实际是个CHttpFile指针
14    CInternetSession session("HttpClient");
15    CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl);
16
17    if (httpFile!=INVALID_HANDLE_VALUE)
18    {
19        dwFileSize=  httpFile->GetLength();//获取文件字节数
20
21        if (dwFileSize==0xFFFFFFFF)
22            return E_FAIL;
23    }
24    else
25    {
26        return E_FAIL;
27    }
28
29    //分配全局存储空间
30    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
31    LPVOID pvData = NULL;
32
33    if (hGlobal == NULL)
34        return E_FAIL;
35
36    if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
37        return E_FAIL;
38
39    //把文件读入内存缓冲区
40    dwByteRead = httpFile->Read(pvData,dwFileSize);
41
42    GlobalUnlock(hGlobal);
43
44    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
45
46    //装入图形文件
47    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
48
49    if(FAILED(bResult))
50        return E_FAIL;
51
52    OLE_XSIZE_HIMETRIC hmWidth; //图片的真实宽度, 单位为英寸
53    OLE_YSIZE_HIMETRIC hmHeight; //图片的真实高度, 单位为英寸
54    pPic->get_Width(&hmWidth);
55    pPic->get_Height(&hmHeight);
56
57    //转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米
58    int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
59    int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
60
61    //将图形输出到屏幕上(有点像BitBlt)
62    bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,
63        0,hmHeight,hmWidth,-hmHeight,NULL);
64
65    pPic->Release();
66
67    httpFile->Close();//关闭打开的文件
68
69    if (SUCCEEDED(bResult))
70    {
71        return S_OK;
72    }
73    else
74    {
75        return E_FAIL;
76    }
77}

代码说明:与上篇 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 动画,只显示第一帧,完整代码不在此列出,朋友们根据实际实现自己的需求。

永久链接 https://yanbin.blog/vc-show-url-image/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。