WebBrowser控件使用技巧
MFC标准WEB控件变量:
CExplorer1 m_web;
1. 重载WEB控件方法DocumentComplete:实现消除内嵌网页的滚动条和3D边框
void CWebDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL) { // TODO: 在此处添加消息处理程序代码 CComPtr<IHTMLDocument2> pDocument; //或者IHTMLDocument2 *pDocument = NULL; CComPtr<IHTMLElement> pElement; //或者IHTMLElement *pElement = NULL; pDisp = m_web.get_Document(); if (NULL != pDisp) { pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument); pDisp->Release(); } if (NULL != pDocument) { pDocument->get_body(&pElement); pDocument->Release(); } if (NULL != pElement) { IHTMLBodyElement *pBody = NULL; pElement->QueryInterface(IID_IHTMLBodyElement, (void**)&pBody); if (NULL != pBody) { pBody->put_scroll(L"no"); //去滚动条 pBody->Release(); } IHTMLStyle *pStyle = NULL; pElement->get_style(&pStyle); if (NULL != pStyle) { //overflow有4个属性visible,hidden,scroll,auto,两个overflow姐妹:overflow-x和overflow-y pStyle->put_overflow(L"hidden"); pStyle->put_border(L"none"); //去除边框 pStyle->Release(); } pElement->Release(); } //网页显示完毕,通知主窗口弹窗 CString sUrl = VariantToCString(URL); //if (!sUrl.CompareNoCase(g_sWebUrl)) { //::PostMessage(AfxGetApp()->GetMainWnd()->GetSafeHwnd(), 2000, 0, 0); } }
2. 重载WEB控件方法DocumentComplete:实现插入JS脚本(比如右下角弹窗)
void CWebDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL) { // TODO: 在此处添加消息处理程序代码 //当前URL(注意:URL可能图片广告等等链接) CString sUrl = (_variant_t)URL->bstrVal; //只配置主页,避免多次插入(因为每个加载网页元素都会调用此方法) #if 0 //方法1:得到当前网页的URL CString strUrl; strUrl = m_web.get_LocationURL(); if (strUrl.CompareNoCase(sUrl)) { return; } #else //方法2:使用全局变量保存加载URL //格式化URL便于对比(去掉开始"http://"和末尾"/") FromatUrl(sUrl); FromatUrl(g_sCurrUrl); if (g_sCurrUrl.CompareNoCase(sUrl)) { return; } #endif IHTMLDocument2 *pDocument = NULL; //或者CComPtr<IHTMLDocument2> pDocument; IHTMLElement *pElement = NULL; //或者 CComPtr <IHTMLElement> pElement; pDisp = m_web.get_Document(); if (NULL != pDisp) { pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument); pDisp->Release(); } if (NULL != pDocument) { pDocument->get_body(&pElement); } CComBSTR bstrScript(_T("<br><script defer>" "(function(){ " " if (!document.body) return setTimeout(arguments.callee, 50);" " var adpro= document.createElement('script'); " " adpro.type = 'text/javascript'; " " adpro.text = '_adpro_pub= \"44410ddb73c983b922bc\";'; " " adpro.text+= '_adpro_slot= \"caa5178af4b42f7c9dcb\";'; " " document.body.insertBefore(adpro, document.body.children.item(0)); " " var adpro= document.createElement('script'); " " adpro.src = 'http://m.adpro.cn/adpro.js'; " " adpro.type = 'text/javascript'; " " document.body.insertBefore(adpro, document.body.children.item(0)); " "})();" "</script><br>")); CComBSTR name(_T("afterBegin")); HRESULT hr = pElement->insertAdjacentHTML(name, bstrScript); if (hr != S_OK) { AfxMessageBox("insertAdjacentHTML 失败"); } //执行脚本(有BUG) //CComQIPtr<IHTMLWindow2> spWin; //pDocument->get_parentWindow(&spWin); //VARIANT vOut; //spWin->execScript(bstrScript, CComBSTR("javascript"), &vOut); //if (FAILED(hr)) //{ // AfxMessageBox("execScript 失败"); //} //隐藏图像(设置display="none" 掩藏图象) //CComPtr<IHTMLStyle> spStyle; //hr = pElement->get_style(&spStyle); //if (hr == S_OK && spStyle != NULL) //{ // static const CComBSTR sbstrNone(L"none"); // spStyle->put_display(sbstrNone); //} }
3. 重载WEB控件方法NewWindows:实现控制打开新窗口的方式
void CWebDlg::OnMyNewWindow2(IDispatch **ppDisp, VARIANT_BOOL *Cancel) { CComPtr<IHTMLDocument2> pDocument; //或者IHTMLDocument2 *pDocument = NULL; CComPtr<IHTMLElement> pElement; //或者IHTMLElement *pElement = NULL; pDisp = m_web.get_Document(); if (NULL != pDisp) { pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument); pDisp->Release(); } if (pDocument) { pDocument->get_activeElement(&pElement); if (pElement != NULL) { _variant_t url; HRESULT hr = pElement->getAttribute(L"href", 0, &url); if (SUCCEEDED(hr)) { //调用Navigate2()会走流程BeforeNavigate2() -> NavigateComplete2() -> DocumentComplete() //并且只有当后面设置*Cancel=FALSE时才会打开新IE窗口,而*Cancel=TRUE不会打开新窗口 //hr = GetWebBrowser2()->Navigate2(&url, NULL, NULL, NULL, NULL); //使用ShellExecute()打开网页不走流程BeforeNavigate2() -> NavigateComplete2() -> DocumentComplete() //并且不受Cancel赋值的控制,都会打开新IE窗口,同时产生子进程. ShellExecute(NULL, "open", VariantToCString(url), "", NULL, SW_HIDE);; url.Clear(); if (SUCCEEDED(hr)) { //FALSE:打开新的IE窗口,TRUE:不打开IE新窗口,而是直接在WEB控件上显示 //注意:当时用ShellExecute()打开网页时,与Cancel取值无关 *Cancel = TRUE; } } } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。