-
-
[讨论]大家有遇到过直接把网络上的图片显示到本地对话框或PICTURE控件上吗?(不用先把图片下到本地,然后再显示)
-
发表于:
2012-11-20 13:26
4846
-
[讨论]大家有遇到过直接把网络上的图片显示到本地对话框或PICTURE控件上吗?(不用先把图片下到本地,然后再显示)
今天在网络上搜到一份。
核心代码:
IPicture *pGlobalPic=NULL;
//最后的时候,判断一下,如果不是NULL,就释放一次。
// 显示图片, lpstrImgUrl 为图片URL地址,hWnd 为窗口句柄
HRESULT 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,10,40,nWidth,nHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
httpFile->Close();//关闭打开的文件
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
附件中包含了一个完整工程,方便交流。
另外附件中也包含了一个发现的BUG,欢迎大家交流学习。
BUG就是有些URL可以有些却有问题,比如:
http://img1.2345.com/duoteimg/softImg/soft/7/1331706305_41.jpg这个URL实际上是有图片的,用这个却得不到,调试可以看出应该是OleLoadPicture这里出了问题,恳请各位大虾看看究竟毛病出在了哪里?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!