首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> Dreamweaver教程
用Visual C#打造多页面网页浏览器-.NET教程,C#语言
作者:网友供稿 点击:167
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
一、简介
    
      大家都知道,目前比较流行的网络浏览器如mozilla firefox以及myie2等都具有多页面浏览功能,每打开一个新的页面都自动产生一个新的选项卡页面,页面的关闭也十分简便。这种设计思想使得用户在浏览多个网页时桌面十分简洁,也避免了用户等待单页面显示的苦恼。由于这些浏览器一般都支持操作多种文件格式,所以当浏览本地机器上的多个文件时也极为方便。
    
      本文使用visual c详细介绍如何实现这种多页面浏览功能。同时,还实现了下面附加功能: 打印, 打印预览,页面属性,选项,查找,查看页面源文件等。
    
      二、关键技术分析
    
      解决问题的关键在于对浏览器控件webbrowser的newwindow2事件的编程。当需要显示某种文件而生成一个新窗口时,newwindow2 事件即被激活。注意,该事件发生在webbrowser控件的新窗口产生之前。例如,作为对导航到一个新窗口或者一个脚本控制的window.open方法的响应,即发生该事件。为了声明当一个新窗口被打开时,将使用我们自己的浏览器程序,应该把参数ppdisp置为application 对象。此时,如果你选择“在新窗口中打开”,则新产生一个窗口来显示web页面。你也可以把registerasbrowser设置为true,这将导致新生成的webbrowser控件参与到窗口命名的冲突问题上。例如,如果一个窗口的名字在脚本的另外一处用到,那么该控件被派上用场,而不是再产生一个新的窗口,因为控件在打开一个新的窗口之前先检查一下所有已存在的窗口名称以避免命名冲突。 在本文示例中,作为对该事件的响应,我们动态地创建一个tab页面,并通过调用createnewwebbrowser()方法产生一个webbrowser控件作为其子控件――这里每一个子控件都有一个包含该控件相关信息的tag属性。详见下面的源码:
    
    private void axwebbrowser1_newwindow2(object sender, axshdocvw.dwebbrowserevents2_newwindow2event e)
    {
     axshdocvw.axwebbrowser  _axwebbrowser = createnewwebbrowser();
     e.ppdisp = _axwebbrowser.application;
     _axwebbrowser.registerasbrowser = true;
    }
    
    private axshdocvw.axwebbrowser createnewwebbrowser()
    {
     axshdocvw.axwebbrowser _axwebbrowser = new axshdocvw.axwebbrowser();
     _axwebbrowser.tag = new he_webbrowsertag();
     tabpage _tabpage = new tabpage();
     _tabpage.controls.add(_axwebbrowser);
     _axwebbrowser.dock = dockstyle.fill;
     _axwebbrowser.beforenavigate2 += new axshdocvw.dwebbrowserevents2_beforenavigate2eventhandler(this.axwebbrowser1_beforenavigate2);
    
     _axwebbrowser.documentcomplete += new axshdocvw.dwebbrowserevents2_documentcompleteeventhandler(this.axwebbrowser1_documentcomplete);
    
     _axwebbrowser.navigatecomplete2 += new axshdocvw.dwebbrowserevents2_navigatecomplete2eventhandler(this.axwebbrowser1_navigatecomplete2);
    
     _axwebbrowser.navigateerror += new axshdocvw.dwebbrowserevents2_navigateerroreventhandler(this.axwebbrowser1_navigateerror);
    
     _axwebbrowser.newwindow2 += new axshdocvw.dwebbrowserevents2_newwindow2eventhandler(this.axwebbrowser1_newwindow2);
    
     _axwebbrowser.progresschange += new axshdocvw.dwebbrowserevents2_progresschangeeventhandler(this.axwebbrowser1_progresschange);
    
     _axwebbrowser.statustextchange += new axshdocvw.dwebbrowserevents2_statustextchangeeventhandler(this.axwebbrowser1_statustextchange);
    
     _axwebbrowser.titlechange += new axshdocvw.dwebbrowserevents2_titlechangeeventhandler(this.axwebbrowser1_titlechange);
    
     _axwebbrowser.commandstatechange += new axshdocvw.dwebbrowserevents2_commandstatechangeeventhandler(this.axwebbrowser1_commandstatechange);
    
     tabcontrol1.tabpages.add(_tabpage);
     tabcontrol1.selectedtab = _tabpage;
    
     return _axwebbrowser;
    
    }
    
      注意,每一个webbrowser控件都有一个tag,我定义成一个简单的class,它用来包含一些该控件相关的独有信息。请看:
    
    public class he_webbrowsertag
    {
     public int _tabindex = 0;
     public bool _canback = false;
     public bool _canforward = false;
    }
    
    
      三、实现“查找”、“查看页面源文件”、“选项”对话框等功能
    
      注意 本例程中使用了一个未公开的guid,其在将来的系统中可以发生变更。
    
      1、定义 iolecommandtarget 接口
    
      为定义一个.net接口以获得关于一个com接口的参考,请遵从下列步骤:
    
      1) 赋予.net接口相应的com接口的guid值;
    
      2) 包含对接口中所有方法的类型声明;
    
      3) 包含对mshtml.dll和shdocvw.dll文件的参考,在visual c .net工程中操作,请遵从:
    
      a. 在项目菜单下单击“添加引用”;
    
      b. 单击“com” 选项卡;
    
      c. 双击“microsoft html object library” 和“microsoft internet controls”。
    
      4) 应该在程序命名空间声明之前,包含下面的接口声明以添加对microsoft html (mshtml) iolecommandtarget接口的参照引用:
    
    
    
    using system;
    using system.runtime.interopservices;
    
    [structlayout(layoutkind.sequential,charset=charset.unicode)]
    
    public struct olecmdtext
    {
     public uint cmdtextf;
     public uint cwactual;
     public uint cwbuf;
     [marshalas(unmanagedtype.byvaltstr,sizeconst=100)]public char rgwz;
    }
    
    [structlayout(layoutkind.sequential)]
    
    public struct olecmd
    {
     public uint cmdid;
     public uint cmdf;
    }
    
    // iolecommandtarget的interop定义
    
    [comimport,
    
    guid("b722bccb-4e68-101b-a2bc-00aa00404770"),
    
    interfacetype(cominterfacetype.interfaceisiunknown)]
    
    public interface iolecommandtarget
    {
     //重要: 下面方法的顺序非常重要,因为本示例中我们使用的是早期绑定,详见msdn中有关.net/com互操作的参考。
     void querystatus(ref guid pguidcmdgroup, uint32 ccmds,
     [marshalas(unmanagedtype.lparray, sizeparamindex=1)] olecmd[] prgcmds, ref olecmdtext cmdtext);
     void exec(ref guid pguidcmdgroup, uint ncmdid, uint ncmdexecopt, ref object pvain, ref object pvaout);
    }
    
    
    
      2、为cgid_iwebbrowser定义一个guid
    
      必须定义cgi_iwebbrowser的guid以通知mshtml如何来处理你的命令id。在.net中实现如下:
    
    
    
    private guid cmdguid = new guid("ed016940-bd5b-11cf-ba4e-00c04fd70816");
    private enum misccommandtarget { find = 1, viewsource, options }
    
    
    
      3、调用exec()方法
    
      注意,下列三个过程成功调用exec()的前提是,已经存在名为webbrowser的浏览器控件的被包容实例。
    
    
    
    private mshtml.htmldocument getdocument()
    {
     try
     {
      mshtml.htmldocument htm = (mshtml.htmldocument)axwebbrowser2.document;
      return htm;
     }
     catch
     {
      throw (new exception("不能从webbrowser控件中获取文件对象"));
     }
    }
    
    //查看源码的方法
    
    public void viewsource()
    {
     iolecommandtarget cmdt;
     object o = new object();
     try
     {
      cmdt = (iolecommandtarget)getdocument();
      cmdt.exec(ref cmdguid, (uint)misccommandtarget.viewsource,
    (uint)shdocvw.olecmdexecopt.olecmdexecopt_dodefault, ref o, ref o);
     }
     catch(exception e)
     {
      system.windows.forms.messagebox.show(e.message);
     }
    }
    
    public void find()
    {
     iolecommandtarget cmdt;
     object o = new object();
     try
     {
      cmdt = (iolecommandtarget)getdocument();
      cmdt.exec(ref cmdguid, (uint)misccommandtarget.find,
    (uint)shdocvw.olecmdexecopt.olecmdexecopt_dodefault, ref o, ref o);
     }
     catch(exception e)
     {
      system.windows.forms.messagebox.show(e.message);
     }
    }
    
    //显示“选项”对话框的方法
    
    public void internetoptions()
    {
     iolecommandtarget cmdt;
     object o = new object();
     try
     {
      cmdt = (iolecommandtarget)getdocument();
      cmdt.exec(ref cmdguid, (uint)misccommandtarget.options,
    (uint)shdocvw.olecmdexecopt.olecmdexecopt_dodefault, ref o, ref o);
     }
     catch
     {
      // 注意:因为该过程相应的cmdid是在internet explorer处理
      // ,所以此处的异常代码块将总被激活,即使该对话框及其操作成功。
      //当然,你可以通过浏览器选择设置来禁止这种错误的出现。
      //不过,即使出现这种提示,对你的主机也无任何损害。
     }
    }
    
    
    
      四、总结
    
      本文通过c编例,详细介绍如何实现一种多页面浏览程序的基本原理。欢迎同仁批评指正。 另外,本文所附源程序在windows 2000/.net 2003/internet explorer 6平台上调试通过。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·用正则表达式过滤脚本的一些研究(asp.net + C#)-.NET教程,C#语言
·射频电路设计的困境及对策
·ASP.NET2.0下为GridView添加鼠标滑过(onmouseover、onmouseout)的行颜色高亮效果!-.NET教程,Asp.Net开发
·Java程序性能测试-JSP教程,Java技巧及代码
·利用JSP 2.0开发Web应用程序-JSP教程,Jsp/Servlet
·PHP模板引擎SMARTY-PHP教程,PHP应用
·.NET中的设计模式五:观察者模式-.NET教程,.NET Framework
·ultradev实例教程:5 做一个相对简单的网站后台(3)
·ASP.net 2.0 自定义控件的开发之数据分页 第二章-.NET教程,Asp.Net开发
·我的DataGrid嵌套DataList(未解决)-ASP教程,ASP应用
最新文章
·桌面壁纸站的建设_站长心得
·dotmore的法宝: 文中关联广告的未来_网赚技巧
·如何用10几个页面的e文小站做到月入350刀_网赚技巧
·fackbook创始人:脸谱是社交工具,而非社区_站长访谈
·搜搜客ceo:分类信息是人与人的价值流动_站长访谈
·丫客网李松:把实业工作和资本市场分开看_站长访谈
·windows xp中巧妙去掉多余的安全删除硬件图标_windows xp
·个人如何建站与站建好后期的运作_站长心得
·google沙盒效应产生的原因及其避免方法_google推广
·提高google adsense广告单价的投放方法 _google推广
相关主题
  • 用visual c#实现xx邮件接收程序_邮件服务器
  • 用visual c++编写电子邮件程序_邮件服务器
  • 用visualbasic5.0设计e-mail程序(mapi)_visualbasic教程
  • 用visualbasic也可以实现p2p_visualbasic教程
  • 用visualbasic自编小游戏_visualbasic教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭