VC窗口(控件)中显示指定 URL 对应图片
在上篇 VC 中用 IPicture 在窗口中显示图片文件 讲到的是 VC 窗口(或控件)中显示本地图片文件,本文延伸这一话题,来演示如何显示网上的图片,即提供图片的 HTTP URL 地址,把它显示到 VC 的界面中来。
本文参考我原来写的一篇日志 VC中使用CInternetSession抓取网页内容 来修改上篇代码中用来显示图片的函数:HRESULT ShowPic(char *lpstrFile,HWND hWnd)。把研究过的东西整理记下来总是好处多多,瞧,至少现在展开其他话题,可参考时便能信手拈来。
重新实现的函数 HRESULT ShowPic(char *lpstrFile,HWND hWnd) 代码如下:
代码说明:与上篇 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) 进行许可。
本文参考我原来写的一篇日志 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) 进行许可。