使用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", , &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, , 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));
}

【MFC】在CHtmlView中在同一窗口显示新打开页面的更多相关文章

  1. vue 数组中嵌套的对象添加新属性--页面更新

    vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735

  2. MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 转

    MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决   在多线程设计中,许多人为了省事,会将对话框类或其它类的指针传给工作线程,而在工作线程中调用该类的成员函数或成员变量等等. ...

  3. MFC中的主窗口修改标题

    MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行&q ...

  4. MFC单文档视图中嵌入GLFW窗口

    开始学习OpenGL由于有一段时间,但是glfw只有窗口区,虽然通过某种手段(移步这里)可以加入工具栏,但仍然无法作为一个标准的GUI,而直接在MFC或Qt里面使用OpenGL API感觉有诸多制肘, ...

  5. Windows MFC 两个OpenGL窗口显示与线程RC问题

    问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...

  6. Android: Service中创建窗口显示

    WindowManager.LayoutParams: int TYPE_SYSTEM_ALERT  Window type: system window, such as low power ale ...

  7. 隐藏windows任务栏中的窗口显示

    在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不 ...

  8. 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

    如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的, ...

  9. Frameset框架,在同一个浏览器窗口中显示不止一个页面

    总结一下.通过使用Frameset框架,可以在同一个浏览器窗口中显示不止一个页面. 先举个例子: 1 <frameset rows="100,*" cols="*& ...

随机推荐

  1. Java12新特性 -- 可中断的 G1 Mixed GC

    G1是一个垃圾收集器,设计用于具有大量内存的多处理器机器.由于它提高了性能效率,G1垃圾收集器最终将取代CMS垃圾收集器. 该垃圾收集器设计的主要目标之一是满足用户设置的预期的 JVM 停顿时间. G ...

  2. java Random 随机重排

    将一个数组或序列随机重新排列. /** * Created by xc on 2019/11/23 * 随机重排 */ public class Test7_7 { public static voi ...

  3. traefik安装

    注意这篇文档有个错误,需要改正一下: 1.nginx1-7.yaml nginx1-8.yaml traefik.yaml 这三个文件里面的80端口需要改成8080端口,否则报错,其他的文件不变. 2 ...

  4. node excel export包导致find函数被覆盖

    这个包确实是巨坑:https://github.com/functionscope/Node-Excel-Export 本来是想用来导出Excel的,没想到把Array的find函数能乱了.这种基础函 ...

  5. K3Wise插件开发实战教程(全套)持续更新中。。。

    这是林枫山自己编写制作的全套K3wise插件教程,欢迎下载学习. 下载目录链接如下(如果链接下载不了,请加QQ:714259796获取教程): 进度01-K3Wise数据表详解     下载学习文档 ...

  6. 头部文件jq嵌入笔记

    var headHtml = '<div class="container">' + '<div class="navbar-header"& ...

  7. war包部署在tomcat下,使用windows service服务方式启动tomcat服务器,在包含调用dll的模块,报dll找不到问题的解决办法

    问题描述: 开发了一个需要调用dll的java web程序,在idea开发环境下运行调试没问题,可以正常运行,在tomcat/bin下,运行批处理startup.bat,启动tomcat服务器,也可以 ...

  8. 启动Tomcat时报异常org.apache.catalina.core.ContainerBase.startInternal A child container failed during start

    之前Tomcat一直运行正常,重启之后一直报以下错误信息: 13-Jun-2019 19:46:13.000 SEVERE [Catalina-startStop-1] org.apache.cata ...

  9. javascript jssdk微信上传一张图片的方法

    javascript jssdk微信上传一张图片的方法 <pre> wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'co ...

  10. JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。

    JVM的本地方法栈   对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方 ...