【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="*& ...
随机推荐
- Java基础 awt Button 点击按钮后在控制台输出文字
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- CentOS 使用官方源yum安装最新nginx版本
CentOS 使用官方源yum安装最新nginx版本 1.创建nginx.repo # vi /etc/yum.repos.d/nginx.repo 2.添加内容#如果是CentOS6,文件内容如下: ...
- git冲突处理-Please move or remove them before you can merge
参考:https://www.cnblogs.com/wenlj/p/5866356.html https://my.oschina.net/lixiaoyan/blog/1821947 #### 将 ...
- Better ultra_simple for Slamtec RPLIDAR on Linux
Improved the ultra_simple program to visualize the samples with GLUT on Linux, tested with Slamtec R ...
- oracle 统计成绩
set serveroutput on; declare cursor c1 is select dno,dname from dep; pdno dep.dno%TYPE; pdname dep.d ...
- C++17新特性optional和string_view
1. optional的作用 类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值. 一种常见的 optional 使用情况是一个可能失败的函数的返回值.与其他手段,如 ...
- 使用Skywalking分布式链路追踪系统
使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...
- navcat excel数据导入mysql的方法
navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...
- LeetCode 421. 数组中两个数的最大异或值(Maximum XOR of Two Numbers in an Array) 71
421. 数组中两个数的最大异或值 421. Maximum XOR of Two Numbers in an Array 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, - , a ...
- 026 SSM综合练习02--数据后台管理系统--数据库表创建及SSM环境搭建
1.数据库准备 本项目我们Oracle数据库,Oracle 为每个项目创建单独user,oracle数据表存放在表空间下,每个用户有独立表空间. (1)采用数据库管理员账号:SYSTEM,再配合数据库 ...