【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", , &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中在同一窗口显示新打开页面的更多相关文章
- vue 数组中嵌套的对象添加新属性--页面更新
vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735
- MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 转
MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 在多线程设计中,许多人为了省事,会将对话框类或其它类的指针传给工作线程,而在工作线程中调用该类的成员函数或成员变量等等. ...
- MFC中的主窗口修改标题
MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行&q ...
- MFC单文档视图中嵌入GLFW窗口
开始学习OpenGL由于有一段时间,但是glfw只有窗口区,虽然通过某种手段(移步这里)可以加入工具栏,但仍然无法作为一个标准的GUI,而直接在MFC或Qt里面使用OpenGL API感觉有诸多制肘, ...
- Windows MFC 两个OpenGL窗口显示与线程RC问题
问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...
- Android: Service中创建窗口显示
WindowManager.LayoutParams: int TYPE_SYSTEM_ALERT Window type: system window, such as low power ale ...
- 隐藏windows任务栏中的窗口显示
在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不 ...
- 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS
如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的, ...
- Frameset框架,在同一个浏览器窗口中显示不止一个页面
总结一下.通过使用Frameset框架,可以在同一个浏览器窗口中显示不止一个页面. 先举个例子: 1 <frameset rows="100,*" cols="*& ...
随机推荐
- jsch配置sftp服务器ssh免密登录
前期对接了一个通过ssh免密登录的需求,是基于原先密码登录sftp服务器的代码上进行改造,实际上代码改动量非常少,趁此机会对自己整理的资料做一下总结. 1. 什么是SFTP SFTP是一个安全文件传送 ...
- 修改Jupyter Notebook默认文件存储路径(已安装Anaconda)
https://blog.csdn.net/weixin_44799144/article/details/91823079 修改Jupyter Notebook默认文件存储路径首先,安装好Anaco ...
- github将本地仓库的代码上传到Github
本篇主要参考博文:https://blog.csdn.net/IT_faquir/article/details/52516214 你要先完成上一篇的操作,即将代码上传到本地仓库中,才能上传到gith ...
- tensorflow 笔记 16:tf.pad
函数: tf.compat.v1.pad tf.pad 函数表达式如下: tf.pad( tensor, paddings, mode='CONSTANT', name=Non ...
- Python中,我该如何切分字符串后保留分割符?
原文来源:https://stackoverflow.com/questions/2136556/in-python-how-do-i-split-a-string-and-keep-the-sepa ...
- Docker 运行Kafka容器
1. 启动Zookeeper docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper 2. 启动Kafka dock ...
- Multi-Channel Buffers
This describes a 4 channels buffer of 16 bit samples.Data organisation :Sample 1, front left speaker ...
- [原]使用kubeadm部署kubernetes(一)
####################### 以下为声明 ##################### 在公众号 木子李的菜田 输入关键词: k8s 有系列安装文档 此文档是之前做笔记在 ...
- Vue 搭建项目
Vue 搭建项目 一.node下载安装: 1.下载:https://nodejs.org/en/download/ 2.安装默认许选择,下一步就行: 3.安装完之后就可以使用npm命令 二.通过@v ...
- CSP2019初赛游记
没想到居然ak了,就纪念一下吧. 这次的联赛,只能说是高三生活的一缕杂音了吧. 这次,我的心态可以说是非常平稳了.毕竟不再会有竞赛生涯的压力,也不会有患得患失的惶恐.不过也许我开考前的放声唱歌惊扰了一 ...