本文主要是介绍VC++ webbrowser函数使用范例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- /*============================说明部分=================================
- 实现一下函数需包含头文件
- #include <Wininet.h>
- #include <Shlwapi.h>
- Linker : Wininet.lib Shlwapi.lib
- =================================================================*/
- /*========================================END========================================*/
- /*============================说明部分=================================
- 清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com
- =================================================================*/
- BOOL CleanUrlCache(LPCTSTR lpUrl)
- {
- LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;
- DWORD dwSize = 0;
- HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);
- if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- return FALSE;
- lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
- hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);
- if (hFind == NULL)
- {
- delete lpICEI;
- return FALSE;
- }
- do
- {
- if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))
- {
- int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);
- }
- delete lpICEI;
- lpICEI = NULL;
- dwSize = 0;
- if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- break;
- lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
- } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));
- if (lpICEI != NULL)
- delete lpICEI;
- return TRUE;
- }
- /*========================================END========================================*/
- /*============================说明部分=================================
- 清除IE所有Cookie
- #include <Wininet.h>
- Linker : Wininet.lib
- =================================================================*/
- void ClearInternetCache()
- {
- DWORD dwNeeded = 0;
- FindFirstUrlCacheEntry(NULL, NULL, &dwNeeded);
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
- {
- unsigned char *buffer = new unsigned char[dwNeeded];
- try
- {
- LPINTERNET_CACHE_ENTRY_INFO lpicei =
- reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
- HANDLE HFind = FindFirstUrlCacheEntry(NULL, lpicei, &dwNeeded);
- DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
- bool no_more_files = false;
- while (!no_more_files)
- {
- if (FindNextUrlCacheEntry(HFind, lpicei, &dwNeeded))
- {
- DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
- }
- else switch (GetLastError())
- {
- case ERROR_INSUFFICIENT_BUFFER:
- {
- delete [] buffer;
- buffer = new unsigned char[dwNeeded];
- lpicei = reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
- break;
- }
- default:
- {
- no_more_files = true;
- break;
- }
- }
- }
- FindCloseUrlCache(HFind);
- }
- catch (...)
- {
- delete [] buffer;
- }
- delete [] buffer;
- }
- }
- /*========================================END========================================*/
- /*============================说明部分=================================
- CString 转换为 VARIANT 类型
- =================================================================*/
- StringToVariant(CString str)
- {
- VARIANT variant;
- VariantInit(&variant);
- variant.vt=VT_BSTR;
- variant.bstrVal=str.AllocSysString();
- return variant;
- }
- /*========================================END========================================*/
- /*============================说明部分=================================
- 打开指定URL,其中m_webBrowser 是web browser
- 控件关联的控件类型的变量
- =================================================================*/
- OpenURL(LPCTSTR strURL)
- {
- VARIANT vInfo;
- VariantInit(&vInfo);
- CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");
- VARIANT vHeaders=StringToVariant(strHeaders);
- m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);
- }
- /*========================================END========================================*/
- /*============================说明部分=================================
- 向指定ID的HTML标记中输入文字
- strID为标记的ID值
- #include <mshtml.h>
- #include <atlbase.h>
- =================================================================*/
- InputText(CString strID, CComVariant strText)
- {
- HRESULT hr;
- IDispatch *pDisp;
- pDisp=m_webBrowser.get_Document(); //得到webBrowser控件接口
- IHTMLDocument2* pDoc;
- hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口
- IHTMLElementCollection* pColl=NULL;
- hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合
- IDispatch *pDisp2;
- VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口
- //V_VT(&index)=VT_I4;
- //V_I4(&index)=0;
- index.vt=VT_I4;
- index.lVal=0;
- VARIANT varID;//要查找的HTML标记ID
- varID=StringToVariant(strID);
- hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
- if(S_OK==hr&&NULL!=pDisp2)
- {
- IHTMLElement* pElem=NULL;
- hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);
- if(S_OK==hr&&NULL!=pElem)
- {
- pElem->put_innerText(strText.bstrVal);
- pElem->Release();
- }
- pDisp2->Release();
- pDisp->Release();
- }
- }
- /*========================================END========================================*/
- /*============================说明部分=================================
- 点击指定ID值的HTML按钮
- strID是按钮的ID值
- #include <mshtml.h>
- #include <atlbase.h>
- =================================================================*/
- ClickBtn(CString strID)
- {
- HRESULT hr;
- IDispatch* pDisp;
- pDisp=m_webBrowser.get_Document();//①得到网页控件接口
- IHTMLDocument2* pDoc;
- hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口
- IHTMLElementCollection* pColl=NULL;
- hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口
- IDispatch* pDisp2;
- VARIANT index;
- //V_VT(&index)=VT_I4;
- //V_I4(&index)=0;
- index.vt=VT_I4;
- index.lVal=0;
- VARIANT varID;
- varID=StringToVariant(strID);
- hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口
- if(S_OK==hr&&NULL!=pDisp2)
- {
- IHTMLElement* pElem=NULL;
- hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口
- if(S_OK==hr&&NULL!=pElem)
- {
- pElem->click();
- pElem->Release();
- }
- pDisp2->Release();
- pDisp->Release();
- }
- }
- /*========================================END========================================*/
- /*===============================================================
- 根据页面Class属性值点击页面元素
- =================================================================*/
- void CPiLiangQianDaoDlg::ClickByClassName()
- {
- IHTMLElementCollection *objAllElement=NULL;
- IHTMLDocument2 *objDocument=NULL;
- objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();
- //由控件得到IHTMLDocument2接口指针
- objDocument-> get_all(&objAllElement); //得到网页所有元素的集合
- IHTMLElement * pElem = NULL;
- VARIANT name;
- CComBSTR tag;
- long a;
- objAllElement-> get_length(&a);
- name.vt=VT_I4;
- for(int i=0;i <a;i++)//遍历所有元素
- {
- name.lVal = i;
- IDispatch * pDispatch=NULL;
- objAllElement-> item(name,name,&pDispatch);
- IHTMLElement* spElement;
- pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
- BSTR tag;
- spElement->get_className(&tag);
- CString ss(tag);
- if(ss == "j_signbtn sign_btn2 j_cansign sign0" || ss == "j_signbtn sign_btn2 j_cansign sign1" || ss == "j_signbtn sign_btn2 j_cansign sign6")
- spElement-> click();
- }
- /*=====================================================================================*/
- /*=====================================================================================
- 根据网页打开的进程设置进度条
- 给web browser添加OnProgressChange响应函数
- m_procCtrl是进度条关联的控件变量
- =======================================================================*/
- if(ProgressMax>0)
- m_procCtrl.SetPos(100*Progress / ProgressMax);
- //========================================
- /*====================================================================
- 搜索点击页面文字连接
- Str为文字
- =======================================================================*/
- ClickItem(CString str)
- {
- IHTMLElementCollection *objAllElement=NULL;
- IHTMLDocument2 *objDocument=NULL;
- objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();
- //由控件得到IHTMLDocument2接口指针
- objDocument-> get_all(&objAllElement); //得到网页所有元素的集合
- IHTMLElement * pElem = NULL;
- VARIANT name;
- CComBSTR tag;
- long a;
- objAllElement-> get_length(&a);
- name.vt=VT_I4;
- for(int i=0;i <a;i++)//遍历所有元素
- {
- name.lVal = i;
- IDispatch * pDispatch=NULL;
- objAllElement-> item(name,name,&pDispatch);
- IHTMLElement* spElement;
- pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
- BSTR tag;
- spElement-> get_outerText(&tag);
- CString ss(tag);
- if(ss=="地图")
- spElement-> click();
- }
- }
- /*=====================================================================================*/
- /*=======================================================================================
- 在DocumentCompleteExplorer判断是否为主框架加载完毕
- 在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
- 加入下面代码:
- ======================================================================================*/CComQIPtr <IWebBrowser2, &IID_IWebBrowser2> pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2> pDoc2; pWeb = pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if (m_ie.GetDocument() != pDoc2) return;
- /*==========================================================================*/
- /*======================================================================
- 判断网页是否加载完毕
- ========================================================================*/
- void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)
- {
- // TODO: 在此处添加消息处理程序代码
- if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0)
- {
- ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));
- m_IsInitDone = 1;
- times++;
- }
- }
- /*======================================================================================
- 截取网页部分内容,并画图显示
- ======================================================================================*/
- {
- CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));
- HRESULT hr;
- IDispatch *pDisp;
- pDisp=m_webBrowser.get_Document(); //得到webBrowser控件接口
- IHTMLDocument2* pDoc;
- hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口
- IHTMLElementCollection* pColl=NULL;
- hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合
- IDispatch *pDisp2;
- VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口
- //V_VT(&index)=VT_I4;
- //V_I4(&index)=0;
- index.vt=VT_I4;
- index.lVal=0;
- VARIANT varID;//要查找的HTML标记ID
- varID=StringToVariant(_T("userlike_info_head_img"));
- hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
- if(S_OK==hr&&NULL!=pDisp2)
- {
- IHTMLElement3* pElem=NULL;
- hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);
- IHTMLElementRender *pRender = NULL;
- pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);
- pRender->DrawToDC(hImageDC);
- }
- }
- /*=================================================================================*/
- /*=================================================================================
- 判断网页是否加在完全(包含框架)
- 原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕!
- =====================================================================================*/
- void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
- {
- // TODO: 在此处添加消息处理程序代码
- CComQIPtr <IWebBrowser2, &IID_IWebBrowser2> pWeb;
- CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2> pDoc2;
- pWeb = pDisp;
- pWeb-> get_Document((IDispatch**)&pDoc2);
- if (m_webBrowser.get_Document() == pDoc2)
- {
- ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
- }
- /
- /*if(0==m_count)
- {
- ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
- m_count++;
- }*/
- }
- /*=============================================================================*/
- /*==============================================================================
- 另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE
- ==============================================================================*/
这篇关于VC++ webbrowser函数使用范例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!