用webbrowser控件浏览网页时,常弹出新的网页窗口,若不做任何控制的话,会在默认浏览器(一般是IE)中打开,这样就在新的窗口打开了,原程序就很难控制了,且存在webbrowser控件和IE的session共享问题。解决方法是让新打开的网页在自己的对话框中打开,具体步骤如下:

一、新建基于对话框的MFC程序,对话框ID为IDD_SHELL_DIALOG,添加Microsoft Web Browser控件(ID为IDC_EXPLORER),并利用向导生成IDC_EXPLORER的控件型变量m_webBrowser,Navigate(),就可以连接要浏览的网页了。

[.cpp]

VARIANT vInfo;
VariantInit(&vInfo);
m_webBrowser.Navigate("http://×××", &vInfo, &vInfo, &vInfo, &vInfo);

二、要为弹出的网页也新建一个对话框(ID为IDD_DIALOG_NEW),利用向导添加类生成CNewDlg类(: public CDialog)。并在该对话框中添加Microsoft Web Browser控件(ID为IDC_EXPLORER_NEW),利用向导生成IDC_EXPLORER的控件型变量m_newwebBrowser,

三、在原对话框(IDD_SHELL_DIALOG)中添加webbrowser控件(IDC_EXPLORER)的NewWindow3()事件,当事件触发时,显示新对话框,并用新的对话框中的webbrowser控件(IDC_EXPLORER_NEW)打开URL地址就行了

[.cpp]

void CShellDlg::NewWindow3Explorer(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)  

{  

    // TODO: 在此处添加消息处理程序代码  

    * Cancel = TRUE;  

    VARIANT vInfo;  

    CNewDlg * newdlg = new CNewDlg;  

    newdlg->Create(IDD_DIALOG_NEW);  

    newdlg->ShowWindow(SW_SHOW);  

    newdlg->m_newwebBrowser.Navigate(bstrUrl, &vInfo, &vInfo, &vInfo, &vInfo);  

}  

四、万一在新窗口中操作又产生新窗口,咋办?那就仿照第三步在新对话框(IDD_DIALOG_NEW)中添加webbrowser控件(IDC_EXPLORER_NEW)的NewWindow3()事件,反正新窗口是new的,只要一个模板就行了,不必再添加新对话框了。

[.cpp]

void CNewDlg::NewWindow3ExplorerNew(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
{
// TODO: 在此处添加消息处理程序代码 * Cancel = TRUE; VARIANT vInfo; CNewDlg * newdlg = new CNewDlg; newdlg->Create(IDD_DIALOG_NEW); newdlg->ShowWindow(SW_SHOW); newdlg->m_newwebBrowser.Navigate(bstrUrl, &vInfo, &vInfo, &vInfo, &vInfo);
}

注意:我把下面这些代码去掉之后就可以了

VARIANT vInfo;  

    CNewDlg * newdlg = new CNewDlg;  

    newdlg->Create(IDD_DIALOG_NEW);  

    newdlg->ShowWindow(SW_SHOW);  

    newdlg->m_newwebBrowser.Navigate(bstrUrl, &vInfo, &vInfo, &vInfo, &vInfo);  

此时程序可以编译过,但是当打开新窗口时,并不会进入到OnNewWindow3Explorer1函数中;经过分析发现把事件定义稍微改一下即可

ON_EVENT(CTestIeDlg, IDC_EXPLORER1, 273 /* NewWindow3 */, OnNewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL  VTS_BSTR VTS_BSTR)
改为下面内容:

ON_EVENT(CTestDlg, IDC_EXPLORER1, 273 /* NewWindow3 */, OnNewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)

VC-基础-WebBrowser控件中弹出新网页窗口的更多相关文章

  1. 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件

    原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...

  2. 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

    原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容 第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也 ...

  3. VC++ 使用WebBrowser控件中html文件以资源形式加载

    . . . . //加载资源文件中的HTML,IDR_HTML1就是HTML文件在资源文件中的ID wchar_t self_path[MAX_PATH] = { }; GetModuleFileNa ...

  4. VC++使用WebBrowser控件,强制给控件指定版本显示网页

    转载:http://www.cnblogs.com/1175429393wljblog/p/5398928.html 最近为了抓取淘宝的成交数据,用C#的WebBrowser控件开发了一个简单的程序. ...

  5. 使用WebBrowser控件播放Flash网页相关问题解决方法(转)

    就是写一个类继承WebBrower控件,重写 protected   override   void   WndProc(ref   System.Windows.Forms.Message   m) ...

  6. WPF中禁止WebBrowser控件打开新窗口

    一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...

  7. <总结>delphi WebBrowser控件的使用中出现的bug

    Delphi WebBrowser控件的使用中出现的bug:  1.WebBrowser.Visible=false:Visible属性不能使WebBrowser控件不可见,暂时用 WebBrowse ...

  8. c# webBrowser控件与js的交互

    转自:http://blog.csdn.net/sd2131512/article/details/7467564 [System.Runtime.InteropServices.ComVisible ...

  9. VB.NET让webbrowser控件中JS脚本错误最新方法(2013-09-16)

    最近也是在项目中遇到了webbrowser控件中想关闭JS脚本错误窗口的问题,所以经过多次测试,终于用一段高效实用的代码完美解决webbrowser控件中JS脚本错误窗口关闭的问题. 通过创建一个子线 ...

随机推荐

  1. 洛谷P3128 [USACO15DEC]最大流Max Flow

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transpo ...

  2. Error:依赖版本不一致

    在编译unity时发现一个问题:依赖版本不一致 解决方案: 通过nugut管理在已安装项里选中要更新的dll文件

  3. C语言的头文件和宏定义详解

    原文链接:https://blog.csdn.net/abc_12366/article/details/79155540

  4. POJ 3537 Crosses and Crosses(sg博弈)

    题目:在1*n 的棋盘里面,A和B都在里面画叉 , 如果谁可以画了一个叉后,可以连成3个叉,那谁胜利 : 分析: 首先考虑如果我在玩游戏,我最希望对手可以画出-x-x or  -xx-   ,  这种 ...

  5. 匿名内部类(new类时覆盖类中方法)

    public class Person { private String name ; protected String getName() { return name; } public void ...

  6. spring静态工厂方法得到单例bean

    import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...

  7. redis结合springboot 无法注入redisTemplate问题

    报错: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean o ...

  8. Binary Strings Gym - 101161G 矩阵快速幂 + 打表

    http://codeforces.com/gym/101161/attachments 这题通过打表,可以知道长度是i的时候的合法方案数. 然后得到f[1] = 2, f[2] = 3, f[3] ...

  9. 13.padding和margin,几种参数

    这篇会很短. 那么如上图所示,margin指的是外边距,padding指的是内边距,border自有其像素宽度,element在1335乘以392的地方. margin和padding一样总共有四个, ...

  10. 一、 Spring IOC 简介

    一 . 什么是IOC(Inversion of Control) IOC :控制反转,也称为依赖注入(DI).听起来有点云里雾里,他到底是个啥,为什么Spirng中最基础的就是它? 我们的项目其实都是 ...