zoukankan      html  css  js  c++  java
  • 【MFC】在CHtmlView中在同一窗口显示新打开页面

    使用MFC的单文档,用IE核心做的简单浏览器。当打开一个新的链接时,IE核心会使用IE来打开一个新窗口显示打开的新页面。为了让新页面在本程序中显示,我试了如下方法,其中的问题一并列出:

    方法1、重载CHTMLView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);

    注意:在90%的情况下,这是个非常好用的方法。比较特殊的地方是2345.com这个网站中,当鼠标指向比如“百度”、“腾讯”等链接时,会自动生成一个下拉列表。如果点击这些产生的下拉列表中的项,这种方法就失效了。依然会使用IE打开。

    这是我遇到的情况。原因是lpElem->getAttribute(TEXT("href"), 0, &url)成功了,但是返回的URL是空的。

    具体的实现内容参考:https://blog.csdn.net/xiangzhang321/article/details/7753177

    void CXxxxView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)
    {
        CComPtr<IHTMLDocument2> lpDoc2;
        CHtmlView::m_pBrowserApp->get_Document((IDispatch**)&lpDoc2);
        if ( lpDoc2 == NULL )
            return;
        
        CComPtr<IHTMLElement> lpElem;
        lpDoc2->get_activeElement(&lpElem);
        if ( lpElem == NULL )
            return;
    
        variant_t url;
        HRESULT hr = lpElem->getAttribute(L"href", 0, &url); 
        if ( SUCCEEDED(hr) && url.vt != VT_NULL ) 
        {
            hr = m_pBrowserApp->Navigate2(&url, NULL, NULL, NULL, NULL);  
            if ( SUCCEEDED(hr) )
                *Cancel = TRUE;
    
            url.Clear();
        } 
    }

    方法2、添加CHTMLView::NewWindow3(IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl);

    注意:网上在NewWindow3有其他实现,具体的可以参考:https://www.cnblogs.com/macher/p/4495234.html。他的实现在我这里虽然不使用IE打开新窗口,但是本程序也无法打开新窗口。在下面的实现代码中,不要使用SendMessage发送自定义消息。

               使用了SendMessage发送消息的结果是跟我前面提到的结果一样。

    步骤:1、在CXxxxView中添加DECLARE_EVENTSINK_MAP()

               2、在CPP中添加:

    BEGIN_EVENTSINK_MAP(CXxxxView, CHtmlView)
        ON_EVENT(CXxxxView, AFX_IDW_PANE_FIRST, 273, CXxxxView::NewWindow3, VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)
    END_EVENTSINK_MAP()

               3、NewWindow3的实现:

    void CXxxxView::NewWindow3(IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl)
    {
        *Cancel = TRUE;
        this->GetMainFrame()->PostMessage(WM_XXXX_NEWPAGE, (WPARAM)((LPCTSTR)bstrUrl));
    }
  • 相关阅读:
    ORACLE数据库概念
    禅道环境搭建手册
    SQL语句实例
    selenium+Python(三)键盘和鼠标操作
    Python 学习网站
    【CSS】display: inline-block,内联元素
    【JS】学习18天Jquery Moblie的总结笔记。
    【.NET】Cookie操作类
    【.NET】转载:使用FileStream批量上传文件。
    【.NET】XML文件的创建,修改,删除
  • 原文地址:https://www.cnblogs.com/yvqvan/p/10816482.html
Copyright © 2011-2022 走看看