用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)

最新文章

  1. Entity Framework 教程——创建实体数据模型
  2. JavaScript的“原型甘露”
  3. hive 使用where条件报错 java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalkerInfo.getConvertedNode
  4. ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法
  5. Android TextView高级特性使用
  6. Android MediaPlayer和SurfaceView播放视频
  7. 整理ORACLE数据库备份常用术语
  8. Java int to String互转
  9. spring中Bean的注入参数详解
  10. 菜鸟日记之JSP1
  11. Sorting Algorithm
  12. setInterval()-----------js 函数总结
  13. Big Number
  14. binaryTree:普通二叉树
  15. Angularjs,WebAPI 搭建一个简易权限管理系统
  16. Ajax封装函数笔记
  17. python自动化测试应用-番外篇--接口测试1
  18. 【CSS】 CSS 定位
  19. python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出
  20. Oracle导出数据EXP00106错误

热门文章

  1. MCP|XHK|High-density peptide arrays help to identify linear immunogenic B cell epitopes in individuals naturally exposed to malaria infection(高密度肽段阵列有助于在自然暴露于疟疾感染的个体中识别线性免疫原性B细胞表位)
  2. SAP 权限层次
  3. PJzhang:英国通信总部GCHQ开源产品-网络瑞士军刀CyberChef
  4. d190305面试题01总结
  5. CodeForces - 186A-Comparing Strings
  6. 【密码学】DES、3DES
  7. liunx下文件授权可执行权限chmod
  8. oop典型应用:实体类
  9. 使用compiz出现奔溃的一些应急办法
  10. Bootstrap插件-carousel(轮播图)