|
HRESULT ShowPic1(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 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;
}
}
两个函数都显示不出来
你的代码中的问题自个慢慢找,给你贴代码,从我的项目中扣出来改了下,拖个 Picture control 放到主窗口,复制代码粘贴到按钮事件中就能看到效果,你要放到自己项目中的话,自己优化一下,把变量改成成员变量,然后在析构器中释放资源。
- // 图片地址
- CString szURL = _T("https://img-blog.csdnimg.cn/20210113161311453.jpg");
- // IDC_IMG 自己拖个 Picture control 放到主窗口
- CDC *pDc = GetDlgItem(IDC_IMG)->GetDC();
- SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
- CInternetSession session;
- CStdioFile* pFile = session.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
- if (NULL == pFile)
- {
- ReleaseDC(pDc);
- AfxMessageBox(_T("OpenURL 失败"));
- return;
- }
- // 获得文件大小
- SIZE_T nLen = (SIZE_T)pFile->SeekToEnd();
- pFile->SeekToBegin();
- if (nLen <= 0)
- {
- pFile->Close();
- delete pFile;
- ReleaseDC(pDc);
- AfxMessageBox(_T("获取文件大小失败"));
- return;
- }
- // 在堆上分配空间
- HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nLen);
- if (NULL == hGlobal)
- {
- pFile->Close();
- delete pFile;
- ReleaseDC(pDc);
- AfxMessageBox(_T("分配内存失败, 错误代码: ") + GetLastError());
- return;
- }
- // 锁定堆空间,获取指向堆空间的指针
- LPVOID lpData = GlobalLock(hGlobal);
- if (NULL == lpData)
- {
- pFile->Close();
- delete pFile;
- GlobalFree(hGlobal);
- ReleaseDC(pDc);
- AfxMessageBox(_T("锁定堆空间失败, 错误代码: ") + GetLastError());
- return;
- }
- pFile->Read(lpData, nLen);
- pFile->Close();
- delete pFile;
- // 在堆中创建流对象
- IStream* pStream = nullptr;
- HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);
- GlobalUnlock(hGlobal);
- if (FAILED(hr))
- {
- GlobalFree(hGlobal);
- ReleaseDC(pDc);
- AfxMessageBox(_T("创建流对象失败"));
- return;
- }
- // 利用流加载图像
- IPicture *pPicture = nullptr;
- hr = OleLoadPicture(pStream, nLen, TRUE, IID_IPicture, (LPVOID*)&pPicture);
- pStream->Release();
- if (FAILED(hr))
- {
- GlobalFree(hGlobal);
- ReleaseDC(pDc);
- AfxMessageBox(_T("加载图像失败"));
- return;
- }
-
- OLE_XSIZE_HIMETRIC nWidth;
- OLE_YSIZE_HIMETRIC nHeight;
- pPicture->get_Width(&nWidth);
- pPicture->get_Height(&nHeight);
- if (pPicture != NULL)
- {
- CRect rect;
- GetDlgItem(IDC_IMG)->GetClientRect(rect);
- pPicture->Render(pDc->m_hDC, 0, 0, rect.Width(), rect.Height(), 0, nHeight, nWidth, -nHeight, &rect);
- pPicture->Release();
- }
- GlobalFree(hGlobal);
- ReleaseDC(pDc);
复制代码
|
上一篇: 组合按键下一篇: OpenSCManager的提权问题
|