首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

想利用CPictureEx将网页图片显示到对话框下,出现有关问题,求指点

2012-12-24 
想利用CPictureEx将网页图片显示到对话框上,出现问题,求指点本帖最后由 VisualEleven 于 2012-12-04 16:16

想利用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;//图片大小

用SetImage(CString imgUrl)可以,用GetImage(CString imgUrl)出错

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;
}


[解决办法]
弄了几天了,还是出错,求高人指点

热点排行