• 测试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

  • 相关阅读:
    尽管以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言
    Java 还是 C++?
    计划的回报
    阶段4:校订
    阶段3:开始创建
    阶段2:如何构建?
    阶段1:要制作什么?
    阶段0:拟出一个计划
    不要迷失
    分析和设计
  • 原文地址:https://www.cnblogs.com/findumars/p/7635862.html
Copyright © 2020-2023  润新知