测试C++代码与WebBrowser HTML的互动

testWebBrowserDlg.h

[cpp] view plain copy
 
  1. // testWebBrowserDlg.h : 头文件  
  2. //  
  3.   
  4. #pragma once  
  5. #include "explorer1.h"  
  6.   
  7.   
  8. #import "C:windowssystem32mshtml.tlb" // location of mshtml.tlb  
  9.   
  10. #include <map>  
  11.   
  12. #include <comdef.h>  
  13. #include <mshtml.h>  
  14. #include <mshtmdid.h>  
  15. /* 
  16. 标题:测试C++代码与WebBrowser HTML的互动 
  17. Author:Kagula 
  18. Date:2014-08-20 
  19. 版本号:3 
  20. Test Env: Windows8.1、VS2013 Update2 
  21. 内容: 
  22. [1]如何拿到html中的elements,取得它的属性! 
  23. [2]如何响应element激发的事件 
  24. [3]如何修改指定element的属性 
  25. [4]如何Render内存中的html字符串 
  26.  
  27. 参考资料 
  28. [1]《MFC中针对WebBrowser控件增加link链接点击事件监控》 
  29. http://www.mworkbox.com/wp/work/509.html 
  30. [2]《IWebBrowser2 interface》 
  31. http://msdn.microsoft.com/en-us/library/aa752127(VS.85).aspx 
  32. [3]《Handling HTML Element Events》 
  33. http://msdn.microsoft.com/en-us/library/bb508508(v=vs.85).aspx 
  34. [4]《如何从 VC web 浏览器应用程序中调用脚本函数》 
  35. http://support.microsoft.com/kb/q185127 
  36. [5]《Loading HTML content from a Stream》 
  37. http://msdn.microsoft.com/en-us/library/ie/aa752047%28v=vs.85%29.aspx 
  38. [6]《How do I get the font color from a piece of HTML source code?》 
  39. http://stackoverflow.com/questions/7402347/how-do-i-get-the-font-color-from-a-piece-of-html-source-code 
  40. [7]《How to create a sink interface in a MFC-based COM client》 
  41. http://support.microsoft.com/default.aspx?scid=kb;en-us;181845 
  42. [8]《How To Use the Microsoft WebBrowser Control to Render HTML from Memory》 
  43. http://www.nuonsoft.com/blog/2010/03/24/how-to-use-the-microsoft-webbrowser-control-to-render-html-from-memory/comment-page-1/ 
  44. [9]《How do I get the font color from a piece of HTML source code?》 
  45. http://stackoverflow.com/questions/7402347/how-do-i-get-the-font-color-from-a-piece-of-html-source-code 
  46. [10]《Using the WebBrowser control, simplified》 
  47. http://www.codeproject.com/Articles/3919/Using-the-WebBrowser-control-simplified 
  48. [11]《Microsoft Internet Explorer 5.5 behaviors》 
  49. http://msdn.microsoft.com/en-us/magazine/cc301528.aspx 
  50. [12]《Using IHTMLEditDesigner》 
  51. http://www.codeproject.com/Articles/6546/Using-IHTMLEditDesigner 
  52. [13]《MFC C++ WebBrowser Control load HTML from a string》 
  53. http://stackoverflow.com/questions/9179179/mfc-c-webbrowser-control-load-html-from-a-string 
  54. [14]VC++ webbrowser函数使用范例 
  55. [15]《【webbrowser使用】_webbrowser使用的相关文章,教程,源码》 
  56. http://www.xuebuyuan.com/zt/12577882.html 
  57. */  
  58.   
  59. namespace kagula  
  60. {  
  61.     struct ConnectionInfo  
  62.     {  
  63.         IDispatch* dispatch;  
  64.         IID iid;          
  65.         DWORD cookie;  
  66.   
  67.         ConnectionInfo() {}  
  68.         ConnectionInfo(IDispatch *dispatch, IID iid, DWORD cookie)  
  69.         {  
  70.             this->dispatch = dispatch, this->iid = iid, this->cookie = cookie;  
  71.         }  
  72.     };  
  73. }  
  74. // CtestWebBrowserDlg 对话框  
  75. class CtestWebBrowserDlg : public CDialogEx  
  76. {  
  77. // 构造  
  78. public:  
  79.     CtestWebBrowserDlg(CWnd* pParent = NULL);   // 标准构造函数  
  80.   
  81. // 对话框数据  
  82.     enum { IDD = IDD_TESTWEBBROWSER_DIALOG };  
  83.   
  84.     protected:  
  85.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持  
  86.   
  87.   
  88. // 实现  
  89. protected:  
  90.     HICON m_hIcon;  
  91.   
  92.     // 生成的消息映射函数  
  93.     virtual BOOL OnInitDialog();  
  94.     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
  95.     afx_msg void OnPaint();  
  96.     afx_msg HCURSOR OnQueryDragIcon();  
  97.     DECLARE_MESSAGE_MAP()  
  98.   
  99. public:  
  100.     CExplorer1 m_webBrowser;  
  101.     void SetElementAttribute(MSHTML::IHTMLDocument2Ptr htmlDoc,CString elementID,CString attributeName,CString value);  
  102.     std::map<IDispatch*, kagula::ConnectionInfo> m_mapElem2EventCookie;//用于释放Connection  
  103.     void ReleaseHTMLConnection();  
  104.   
  105.     void DemoGetElement(LPDISPATCH pDisp, VARIANT* URL);  
  106.     void DemoGetAllLinkElement(LPDISPATCH pDisp, VARIANT* URL);  
  107.   
  108.     void OnClick(MSHTML::IHTMLEventObj *pEvtObj);  
  109.     void OnLostFocus(MSHTML::IHTMLEventObj *pEvtObj);  
  110.     void WriteHTML(const wchar_t* html);  
  111.   
  112.     afx_msg void OnBnClickedMemoryRender();  
  113.   
  114.     //added new three map macros  
  115.     DECLARE_EVENTSINK_MAP()  
  116.     DECLARE_DISPATCH_MAP()    
  117.     DECLARE_INTERFACE_MAP()  
  118.   
  119.     void BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel);  
  120.     void DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL);  
  121.     afx_msg void OnBnClickedBtnSetspecifiedelementattr();  
  122.     virtual void OnOK();  
  123.     virtual void OnCancel();  
  124. };  

testWebBrowserDlg.cpp

[cpp] view plain copy
 
  1. // testWebBrowserDlg.cpp : 实现文件  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6.   
  7. #include "testWebBrowser.h"  
  8. #include "testWebBrowserDlg.h"  
  9. #include "afxdialogex.h"  
  10.   
  11. #include <string>  
  12.   
  13. #include <afxctl.h>  
  14.   
  15. #ifdef _DEBUG  
  16. #define new DEBUG_NEW  
  17. #endif  
  18.   
  19.   
  20. // CtestWebBrowserDlg 对话框  
  21. CtestWebBrowserDlg::CtestWebBrowserDlg(CWnd* pParent /*=NULL*/)  
  22.     : CDialogEx(CtestWebBrowserDlg::IDD, pParent)  
  23. {  
  24.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
  25. }  
  26.   
  27. void CtestWebBrowserDlg::DoDataExchange(CDataExchange* pDX)  
  28. {  
  29.     CDialogEx::DoDataExchange(pDX);  
  30.     DDX_Control(pDX, IDC_EXPLORER1, m_webBrowser);  
  31. }  
  32.   
  33. BEGIN_MESSAGE_MAP(CtestWebBrowserDlg, CDialogEx)  
  34.     ON_WM_SYSCOMMAND()  
  35.     ON_WM_PAINT()  
  36.     ON_WM_QUERYDRAGICON()  
  37.     ON_BN_CLICKED(IDC_BTN_RENDERSTRING, &CtestWebBrowserDlg::OnBnClickedMemoryRender)  
  38.     ON_BN_CLICKED(IDC_BTN_SETSPECIFIEDELEMENTATTR, &CtestWebBrowserDlg::OnBnClickedBtnSetspecifiedelementattr)  
  39. END_MESSAGE_MAP()  
  40.   
  41.   
  42. // CtestWebBrowserDlg 消息处理程序  
  43.   
  44. BOOL CtestWebBrowserDlg::OnInitDialog()  
  45. {  
  46.     CDialogEx::OnInitDialog();  
  47.   
  48.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
  49.     //  执行此操作  
  50.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
  51.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
  52.   
  53.     // TODO:  在此添加额外的初始化代码  
  54.     EnableAutomation();//没有这行代码会导致GetIDispatch(FALSE)失败!  
  55.   
  56.     //m_webBrowser.Navigate(L"D:\Workspace\testWebBrowser\testWebBrowser\test.html",NULL,NULL,NULL,NULL);  
  57.     m_webBrowser.Navigate(L"about:blank", NULL, NULL, NULL, NULL);  
  58.        
  59.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
  60. }  
  61.   
  62. void CtestWebBrowserDlg::OnSysCommand(UINT nID, LPARAM lParam)  
  63. {  
  64.     CDialogEx::OnSysCommand(nID, lParam);  
  65. }  
  66.   
  67. // 如果向对话框添加最小化按钮,则需要下面的代码  
  68. //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,  
  69. //  这将由框架自动完成。  
  70.   
  71. void CtestWebBrowserDlg::OnPaint()  
  72. {  
  73.     if (IsIconic())  
  74.     {  
  75.         CPaintDC dc(this); // 用于绘制的设备上下文  
  76.   
  77.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
  78.   
  79.         // 使图标在工作区矩形中居中  
  80.         int cxIcon = GetSystemMetrics(SM_CXICON);  
  81.         int cyIcon = GetSystemMetrics(SM_CYICON);  
  82.         CRect rect;  
  83.         GetClientRect(&rect);  
  84.         int x = (rect.Width() - cxIcon + 1) / 2;  
  85.         int y = (rect.Height() - cyIcon + 1) / 2;  
  86.   
  87.         // 绘制图标  
  88.         dc.DrawIcon(x, y, m_hIcon);  
  89.     }  
  90.     else  
  91.     {  
  92.         CDialogEx::OnPaint();  
  93.     }  
  94. }  
  95.   
  96. //当用户拖动最小化窗口时系统调用此函数取得光标  
  97. //显示。  
  98. HCURSOR CtestWebBrowserDlg::OnQueryDragIcon()  
  99. {  
  100.     return static_cast<HCURSOR>(m_hIcon);  
  101. }  
  102.   
  103.   
  104. //测试:Render内存中的HTML  
  105. void CtestWebBrowserDlg::OnBnClickedMemoryRender()  
  106. {  
  107.     m_webBrowser.Navigate(L"app://mymemory.page",NULL,NULL,NULL,NULL);  
  108. }  
  109.   
  110. BEGIN_EVENTSINK_MAP(CtestWebBrowserDlg, CDialogEx)  
  111.     ON_EVENT(CtestWebBrowserDlg, IDC_EXPLORER1, 250, CtestWebBrowserDlg::BeforeNavigate2Explorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)  
  112.     ON_EVENT(CtestWebBrowserDlg, IDC_EXPLORER1, 259, CtestWebBrowserDlg::DocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)  
  113. END_EVENTSINK_MAP()  
  114.   
  115. /* 第二步:处理所有种类元素的事件 */  
  116. BEGIN_INTERFACE_MAP(CtestWebBrowserDlg, CCmdTarget)  
  117.     INTERFACE_PART(CtestWebBrowserDlg, DIID_HTMLElementEvents2, Dispatch)  
  118. END_INTERFACE_MAP()  
  119.   
  120. /* 第三步: 某种事件(元素类型无关)和哪个响应函数连*/  
  121. BEGIN_DISPATCH_MAP(CtestWebBrowserDlg, CCmdTarget)  
  122.     DISP_FUNCTION_ID(CtestWebBrowserDlg, "HTMLELEMENTEVENTS2_ONCLICK",    DISPID_HTMLELEMENTEVENTS2_ONCLICK,    CtestWebBrowserDlg::OnClick, VT_EMPTY, VTS_DISPATCH)  
  123.     DISP_FUNCTION_ID(CtestWebBrowserDlg, "HTMLELEMENTEVENTS2_ONFOCUSOUT", DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT, CtestWebBrowserDlg::OnLostFocus, VT_EMPTY, VTS_DISPATCH)  
  124. END_DISPATCH_MAP()  
  125.   
  126. void CtestWebBrowserDlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)  
  127. {  
  128.     CString strURL(URL->bstrVal);  
  129.     *Cancel = FALSE;  
  130.     if (strURL == _T("about:blank"))  
  131.     {  
  132.         *Cancel = FALSE;  
  133.     }     
  134.     else  
  135.     {  
  136.         if (strURL.Find(_T("ThePageNeverReach.htm")) > 0 )  
  137.         {//阻止跳转到指定页面!  
  138.             *Cancel = TRUE;  
  139.             return;  
  140.         }  
  141.     }  
  142.   
  143.     if (!(*Cancel))  
  144.     {  
  145.         //进入新页面之前,先释放掉事件连接  
  146.         ReleaseHTMLConnection();  
  147.     }  
  148.   
  149.     //演示,render内存中的html页面!  
  150.     if (strURL.Find(_T("app://mymemory.page")) >= 0)  
  151.     {  
  152.         *Cancel = TRUE;  
  153.         WriteHTML(L"<html><body><h1>My Header</h1><p>Some text below the header</p></body></html>");  
  154.         return;  
  155.     }  
  156. }  
  157.   
  158.   
  159. void CtestWebBrowserDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)  
  160. {  
  161.     //DemoGetElement(pDisp, URL);  
  162.     DemoGetAllLinkElement(pDisp, URL);  
  163.   
  164. }//end func  
  165.   
  166. //演示:鼠标点击事件  
  167. void CtestWebBrowserDlg::OnClick(MSHTML::IHTMLEventObj *pEvtObj)  
  168. {  
  169.     MSHTML::IHTMLElementPtr elem = pEvtObj->srcElement;  
  170.     CString cstrID = elem->Getid();  
  171.     CString cstrTag = elem->GettagName();//标签的名字  
  172.   
  173.     if (cstrID.GetLength()<=0)  
  174.     {  
  175.         return;  
  176.     }  
  177.       
  178.     _variant_t name = elem->getAttribute(_T("name"), 0);  
  179.     CString cstrName;  
  180.     if (name.vt != VT_NULL)  
  181.     {  
  182.         cstrName = name;  
  183.     }  
  184.   
  185.     _variant_t href = elem->getAttribute(_T("value"), 0);  
  186.     CString cstrHref;  
  187.     if (href.vt != VT_NULL)  
  188.     {  
  189.         cstrHref = href.bstrVal;  
  190.     }  
  191.   
  192.     CString msg;  
  193.     msg.Format(L"[id=%s][name=%s][tag=%s][value=%s]", cstrID.GetBuffer(),   
  194.         cstrName.GetBuffer(), cstrTag.GetBuffer(), cstrHref.GetBuffer(MAX_PATH));  
  195.     TRACE(msg);  
  196. }  
  197.   
  198. //演示:响应 标签 失去焦点事件  
  199. void CtestWebBrowserDlg::OnLostFocus(MSHTML::IHTMLEventObj *pEvtObj)  
  200. {  
  201.     MSHTML::IHTMLElementPtr elem = pEvtObj->srcElement;  
  202.   
  203.     CString cstrID = elem->Getid();  
  204.     if (cstrID.GetLength()<=0)  
  205.     {  
  206.         return;  
  207.     }  
  208.   
  209.     CString msg;  
  210.     msg.Format(L"OnLostFocus cstrID = [%s]", cstrID.GetBuffer());  
  211.     AfxMessageBox(msg);  
  212. }  
  213.   
  214. //演示:拿到指定ID的标签元素,并打印它的属性  
  215. void CtestWebBrowserDlg::DemoGetElement(LPDISPATCH pDisp, VARIANT* URL)  
  216. {  
  217.     IWebBrowser2Ptr webBrowser(pDisp);  
  218.     IDispatchPtr htmlDocDisp;  
  219.     (*webBrowser).get_Document(&htmlDocDisp);  
  220.     MSHTML::IHTMLDocument2Ptr htmlDoc(htmlDocDisp);  
  221.   
  222.     MSHTML::IHTMLElementCollectionPtr elements;  
  223.     (*htmlDoc).get_all(&elements);  
  224.   
  225.     IDispatchPtr disp;  
  226.     _variant_t index(0L, VT_I4);  
  227.     do  
  228.     {  
  229.         disp = (*elements).item(_variant_t("myFontTag"), index);  
  230.         if (disp != NULL)  
  231.         {  
  232.             MSHTML::IHTMLElementPtr element(disp);  
  233.   
  234.             variant_t vtValue = element->getAttribute("color", 0);  
  235.             CString cstr = vtValue;  
  236.             TRACE(L"mytag标签的color属性为%s ", cstr.GetBuffer(MAX_PATH));  
  237.   
  238.             ++index.lVal;  
  239.         }  
  240.     } while (disp != NULL);  
  241. }  
  242.   
  243. /* 
  244. 拿到元素,并做链接 
  245. [1]《AfxConnectionAdvise》 
  246. http://msdn.microsoft.com/en-us/library/b9h84ebk.aspx 
  247. [2]《How to create a sink interface in a MFC-based COM client》 
  248. http://support.microsoft.com/default.aspx?scid=kb;en-us;181845 
  249. [3]《同Document建立Connection》 
  250. http://www.popkistopki.ru/ch08e.htm 
  251. */  
  252. void CtestWebBrowserDlg::DemoGetAllLinkElement(LPDISPATCH pDisp, VARIANT* URL)  
  253. {  
  254.     // Get the HTML document. //  
  255.     IWebBrowser2Ptr webBrowser(pDisp);  
  256.     IDispatchPtr htmlDocDisp;  
  257.     (*webBrowser).get_Document(&htmlDocDisp);  
  258.     MSHTML::IHTMLDocument2Ptr htmlDoc(htmlDocDisp);  
  259.   
  260.     if (htmlDoc == NULL) //URL属性为空  
  261.     {  
  262.         return;  
  263.     }  
  264.   
  265.     //打印HTML页面内容  
  266.     MSHTML::IHTMLElementPtr body = htmlDoc->Getbody();  
  267.     variant_t html = body->parentElement->outerHTML;  
  268.     //variant_t bodyHTML = body->GetouterHTML();  
  269.     CString cstrBodyHTML = html;  
  270.     TRACE(L"cstrBodyHTML.GetBuffer()======== %s ", cstrBodyHTML.GetBuffer());  
  271.   
  272.   
  273.     //取HTML中的元素  
  274.     DWORD dwCookie = 0;  
  275.     // Get the collection of elements.  
  276.     MSHTML::IHTMLElementCollectionPtr elements;  
  277.     (*htmlDoc).get_all(&elements);  
  278.   
  279.     IDispatchPtr disp;  
  280.     _variant_t index(0L, VT_I4);  
  281.     do  
  282.     {  
  283.         //Get all elements  
  284.         disp = (*elements).item(index, index);  
  285.         if (disp != NULL)  
  286.         {  
  287.             // Examine their action attribute to determine what should be done.  
  288.             IDispatchPtr element(disp);  
  289.             MSHTML::IHTMLElementPtr elemTag(disp);  
  290.   
  291.             //第一步:建立Connection  
  292.             DWORD dwCookie = 0;  
  293.             BSTR name = NULL;  
  294.             elemTag->get_tagName(&name);  
  295.             if (name != NULL)  
  296.             {  
  297.                 //is link!!!!  
  298.                 LPUNKNOWN pUnkSink = GetIDispatch(FALSE);  
  299.   
  300.                 //关联全部类型元素  
  301.                 if (AfxConnectionAdvise(element, DIID_HTMLElementEvents2, pUnkSink, FALSE, &dwCookie))  
  302.                 {  
  303.                     kagula::ConnectionInfo ci(element.GetInterfacePtr(), DIID_HTMLElementEvents2, dwCookie);  
  304.                     m_mapElem2EventCookie[element.GetInterfacePtr()] = ci;  
  305.                 }  
  306.             }//end if  
  307.             ++index.lVal;  
  308.         }  
  309.     } while (disp != NULL);  
  310. }  
  311.   
  312. //释放同HTML的Connection  
  313. void CtestWebBrowserDlg::ReleaseHTMLConnection()  
  314. {  
  315.     std::map<IDispatch *, kagula::ConnectionInfo>::iterator itr;  
  316.     for (itr = m_mapElem2EventCookie.begin(); itr != m_mapElem2EventCookie.end(); itr++)  
  317.     {  
  318.         //DIID_HTMLDocumentEvents、DIID_HTMLAnchorEvents2、DIID_HTMLButtonElementEvents  
  319.         AfxConnectionUnadvise(itr->first,  itr->second.iid, GetIDispatch(FALSE), FALSE, itr->second.cookie);  
  320.     }  
  321.     m_mapElem2EventCookie.clear();  
  322. }  
  323.   
  324. //测试,设置当前页面指定元素的属性  
  325. void CtestWebBrowserDlg::OnBnClickedBtnSetspecifiedelementattr()  
  326. {  
  327.     CComPtr<IDispatch> spDisp = m_webBrowser.get_Application();  
  328.     if (spDisp != NULL)  
  329.     {  
  330.         CComPtr<IWebBrowser2> spWeb;  
  331.         HRESULT hr = spDisp->QueryInterface(IID_IWebBrowser2, (void**)&spWeb);  
  332.         if (SUCCEEDED(hr))  
  333.         {  
  334.             IDispatchPtr htmlDocDisp;  
  335.             spWeb->get_Document(&htmlDocDisp);  
  336.             MSHTML::IHTMLDocument2Ptr htmlDoc(htmlDocDisp);  
  337.   
  338.             if (htmlDoc == NULL) //URL属性为空  
  339.             {  
  340.                 return;           
  341.             }  
  342.   
  343.             SetElementAttribute(htmlDoc, L"firstname", L"value", L"Marcia");  
  344.             SetElementAttribute(htmlDoc, L"lastname",L"value", L"JohnDoe");  
  345.             SetElementAttribute(htmlDoc, L"female",L"checked", L"1");  
  346.             SetElementAttribute(htmlDoc, L"bike",L"checked", L"");  
  347.             SetElementAttribute(htmlDoc, L"car",L"checked", L"1");  
  348.   
  349.             //演示,重定向到其它URL  
  350.             //CComVariant varURL("http://www.intel.com");  
  351.             //spWeb->Navigate2(&varURL, NULL, NULL, NULL, NULL);  
  352.         }  
  353.     }  
  354.   
  355. }  
  356.   
  357. void CtestWebBrowserDlg::SetElementAttribute(MSHTML::IHTMLDocument2Ptr htmlDoc, CString elementID, CString attributeName, CString value)  
  358. {  
  359.     MSHTML::IHTMLElementCollectionPtr elements;  
  360.     htmlDoc->get_all(&elements);  
  361.   
  362.     IDispatchPtr disp;  
  363.     _variant_t index(0L, VT_I4);  
  364.     do  
  365.     {  
  366.         disp = (*elements).item(_variant_t(elementID.GetBuffer()), index);  
  367.         if (disp != NULL)  
  368.         {  
  369.             MSHTML::IHTMLElementPtr element(disp);  
  370.   
  371.             element->setAttribute(attributeName.GetBuffer(), value.GetBuffer(),0);  
  372.   
  373.             ++index.lVal;  
  374.         }  
  375.     } while (disp != NULL);  
  376. }  
  377.   
  378. /*测试render内存中的html*/  
  379. void CtestWebBrowserDlg::WriteHTML(const wchar_t* html)  
  380. {  
  381.     IDispatch* pHtmlDoc = m_webBrowser.get_Document();  
  382.   
  383.     /* 
  384.     在调用这段代码之前,如果你还没有url需要navigate,就必须在 
  385.     OnInitDialog中插入下面的代码,否则拿不到document! 
  386.     m_webBrowser.Navigate(L"about:blank",NULL,NULL,NULL,NULL); 
  387.     */  
  388.     if (!pHtmlDoc)  
  389.         return;  
  390.   
  391.     CComPtr<IHTMLDocument2> doc2;  
  392.     doc2.Attach((IHTMLDocument2*)pHtmlDoc);  
  393.     if (!doc2)  
  394.         return;  
  395.     // Creates a new one-dimensional array  
  396.     SAFEARRAY* psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);  
  397.     if (!psaStrings)  
  398.         return;  
  399.     BSTR bstr = SysAllocString(html);  
  400.     if (bstr)  
  401.     {  
  402.         VARIANT* param;  
  403.         HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);  
  404.         if (SUCCEEDED(hr))  
  405.         {  
  406.             param->vt = VT_BSTR;  
  407.             param->bstrVal = bstr;  
  408.             hr = SafeArrayUnaccessData(psaStrings);  
  409.             if (SUCCEEDED(hr))  
  410.             {  
  411.                 doc2->write(psaStrings);  
  412.                 doc2->close();  
  413.             }  
  414.         }  
  415.     }  
  416.     // SafeArrayDestroy calls SysFreeString for each BSTR!  
  417.     if (psaStrings)  
  418.         SafeArrayDestroy(psaStrings);  
  419. }  
  420.   
  421. //退出前要释放链接  
  422. void CtestWebBrowserDlg::OnOK()  
  423. {  
  424.     ReleaseHTMLConnection();  
  425.     CDialogEx::OnOK();  
  426. }  
  427.   
  428.   
  429. void CtestWebBrowserDlg::OnCancel()  
  430. {  
  431.     ReleaseHTMLConnection();  
  432.     CDialogEx::OnCancel();  
  433. }  

test.html

[html] view plain copy
 
    1. <head>  
    2.     <title></title>  
    3.     <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
    4. </head>  
    5. <body>  
    6.     <h1 id="myH1Tag">测试从H1标签能不能得到事件</h1>  
    7.     <font id="myFontTag" color=#5a6571>测试能不能从font标签得到事件</font<br />  
    8.     <br />  
    9.     <br />  
    10.     <id="idOfA" name="nameOfA" href="file:D:Workspace estWebBrowser estWebBrowserThePageNeverReach.htm">测试禁止页面跳转</a><br/>  
    11.     <id="id2OfA" name="name2OfA" href="file:D:Workspace estWebBrowser estWebBrowserHTMLPage.htm">测试用户点击链接, C++后台得到消息!,并跳转到页面</a>  
    12.   
    13.     <form>  
    14.         First name: <input id='firstname' type='text' name='firstname' /><br />  
    15.         Last name: <input id='lastname' type='text' name='lastname' /><br />  
    16.         Password: <input id='password' type='password' name='pwd' /><br><br />  
    17.         <input type='radio' id='male' name='sex' value='male' />Male<br />  
    18.         <input type='radio' id='female' name='sex' value='female' />Female<br /><br />  
    19.         <input type='checkbox' id='bike' name='vehicle' value='Bike' />I have abdsmasterbike<br />  
    20.         <input type='checkbox' id='car' name='vehicle' value='Car' />I have a car <br /><br />  
    21.         <input type='button' id='ok' value='OK' /><br />  
    22.         <input type='button' id='cancel' value='Cancel' /><br /><br />  
    23.     </form>  
    24. </body>  

http://blog.csdn.net/lee353086/article/details/38537415

原文地址:https://www.cnblogs.com/findumars/p/7635862.html