想利用CPictureEx将网页图片显示到对话框上,出现问题,求指点
本帖最后由 VisualEleven 于 2012-12-04 16:16:15 编辑 想读取网页图片,如http://image.58.com/showphone.aspx?t=wap&v=D4CECEFE9BDA3E21Z91A4A71A702F7366到对话框的上
前提:不想保存图片到本地,想读取到内存中
定义成员变量 CString m_strUrl;//要读取的网页图片地址
CPictureExm_Picture;
HGLOBAL m_hGlobal; //内存句柄
DWORD m_dwFileSize;//图片大小
void CReadUrlImgDlg::OnButtonShow()
{
// TODO: Add your control notification handler code here
UpdateData();
m_strUrl.TrimLeft();
m_strUrl.TrimRight();
if(m_strUrl == "")
{
AfxMessageBox("请输入图片网址!");
UpdateData(FALSE);
return;
}
GlobalFree(m_hGlobal);
m_hGlobal = NULL;
BOOL bFlag = SetImage(m_strUrl);
//BOOL bFlag = GetImage(m_strUrl);
//AfxMessageBox((LPCTSTR)m_hGlobal);
if(!bFlag)
{
AfxMessageBox("获取图片出错!");
UpdateData(FALSE);
return;
}
if(m_Picture.Load(m_hGlobal, m_dwFileSize))
{
m_Picture.Draw();
}
else
{
AfxMessageBox("显示图片出错!");
}
UpdateData(FALSE);
}
BOOL CReadUrlImgDlg::SetImage(CString imgUrl)
{
BOOL bFlag = TRUE;
try
{
HINTERNET hInternet = NULL;
hInternet = InternetOpen(_T("session"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if (!hInternet)
{
bFlag = FALSE;
return bFlag;
}
HINTERNET hUrl;
CHAR szHead[] = _T("Accept: */*\r\nAccept-Language: zh-cn\r\n"
"Accept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 "
"(compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)");
hUrl = InternetOpenUrl(hInternet, imgUrl, szHead, lstrlenA(szHead),
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | \
INTERNET_FLAG_RELOAD,0);
if (!hUrl)
{
bFlag = FALSE;
//InternetCloseHandle(hInternet);
return bFlag;
}
DWORD length = 1024 * 10;
DWORD readLength = 0;
BYTE* pBuffer = NULL;
BYTE* p = NULL;
//下载图片
pBuffer = new BYTE[length];
memset(pBuffer, 0, length);
p = pBuffer;
BOOL read = FALSE;
do
{
read=InternetReadFile(hUrl, p, 16384, &readLength);
if(!read)
{
bFlag = FALSE;
return bFlag;
}
if(readLength==0)
break;
/*
if ((p-pBuffer+readLength)>=length)
{
DWORD len=2*length;
BYTE* tmp=NULL;
tmp=new BYTE[len];
memset(tmp,0,len);
memcpy(tmp, pBuffer, length);
int offset=p-pBuffer;
delete[] pBuffer;
pBuffer=tmp;
delete[] tmp;
p=pBuffer+offset;
length=len;
}
*/
p+=readLength;
}while(TRUE);
InternetCloseHandle(hUrl);
InternetCloseHandle(hInternet);
m_dwFileSize = p-pBuffer;
//生成图片
//GlobalFree(m_hGlobal);
//m_hGlobal = NULL;
m_hGlobal = GlobalAlloc(GMEM_MOVEABLE, m_dwFileSize);
LPVOID pvData = NULL;
if (m_hGlobal != NULL)
{
if ((pvData = GlobalLock(m_hGlobal)) != NULL)
{
memcpy(pvData, pBuffer, m_dwFileSize);
}
GlobalUnlock(m_hGlobal);
}
if (pBuffer!=NULL)
{
delete[] pBuffer;
}
}
catch(...)
{
bFlag = FALSE;
}
return bFlag;
}
BOOL CReadUrlImgDlg::GetImage(CString imgUrl)
{
m_dwFileSize = 0;
BOOL bFlag = TRUE;
try
{
HINTERNET hInternet = NULL;
hInternet = InternetOpen(_T("session"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if (!hInternet)
{
bFlag = FALSE;
return bFlag;
}
HINTERNET hUrl;
CHAR szHead[] = _T("Accept: */*\r\nAccept-Language: zh-cn\r\n"
"Accept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 "
"(compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)");
hUrl = InternetOpenUrl(hInternet, imgUrl, szHead, lstrlenA(szHead),
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | \
INTERNET_FLAG_RELOAD,0);
if (!hUrl)
{
bFlag = FALSE;
//InternetCloseHandle(hInternet);
return bFlag;
}
//读取HTML文件
LPVOID lpvBuffer = NULL; //用于存储返回数据的内存
LPVOID lpvBuffTemp = NULL; //临时缓冲区
LPVOID lpvBuff = NULL;
DWORD dwBufferLength = 1024; //lpvBuffer的内存大小
DWORD dwReaded = 0; //读取了多少字节的数据
DWORD nCount = 0; //读取了多少次数据
lpvBuffer = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, dwBufferLength + 1);//给'\0'留个位子
do
{//循环读取,直到读完
InternetReadFile(hUrl, lpvBuffer, dwBufferLength, &dwReaded);
*((BYTE *)lpvBuffer+dwReaded) = '\0';
nCount++;
//分配内存
lpvBuffTemp = lpvBuff;
lpvBuff = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof (BYTE)*(dwBufferLength*nCount + 1));
if (NULL != lpvBuffTemp)
{
memcpy(lpvBuff, lpvBuffTemp, dwBufferLength*(nCount-1) + 1);
}
strcat((char *)lpvBuff, (const char *)lpvBuffer);
} while (0 != dwReaded);
InternetCloseHandle(hUrl);
InternetCloseHandle(hInternet);
GlobalFree(lpvBuffTemp);
lpvBuffTemp = NULL;
GlobalFree(lpvBuffer);
lpvBuffer = NULL;
m_dwFileSize = strlen((const char *)lpvBuff);
m_hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_dwFileSize);
LPVOID pvData = NULL;
if (m_hGlobal != NULL)
{
if ((pvData = GlobalLock(m_hGlobal)) != NULL)
{
pvData = lpvBuff;
//memset(pvData, '\0', m_dwFileSize);
//memcpy(pvData, lpvBuff, m_dwFileSize);
}
GlobalUnlock(m_hGlobal);
}
//m_hGlobal = lpvBuff;
lpvBuff = NULL;
//AfxMessageBox((LPCTSTR)m_hGlobal);
}
catch(...)
{
bFlag = FALSE;
}
return bFlag;
}