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));
    }
  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/yvqvan/p/10816482.html
Copyright © 2011-2022 走看看