WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法

简介: 原文:WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法首先多谢朋友们的捧场; 今天给大家带来一个操作WebBrowser的一些高级方法,我专门写了一个html编辑器的实现代码,有需要的朋友可以自己扩充; 功能实现是直接写流到WebBrowser内不通过临时文件,并且支持对WebBrowser的一些高级控制(其实script可以达到的均可达到,想知道怎么搞的可以阅读代码)。
原文: WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法

首先多谢朋友们的捧场;

今天给大家带来一个操作WebBrowser的一些高级方法,我专门写了一个html编辑器的实现代码,有需要的朋友可以自己扩充;
功能实现是直接写流到WebBrowser内不通过临时文件,并且支持对WebBrowser的一些高级控制(其实script可以达到的均可达到,想知道怎么搞的可以阅读代码)。

其中关于IPersistStreamInit接口的声明费了翻工夫,因为以前在 delphi 中没这么麻烦,呵呵。在网络上找了大半天没找到,最后还是祭出Reflector,反编译Windows.Forms,需要的朋友可以不用辛苦的自己搞了!

我在这个演示里,制作的html编辑环境是比简单的,您可以看看,比较比较 CodeProject 上的代码;我采用的是ie自身提供的编辑方法,只是这样的方式都被运用于web方式的编辑器内,就好比这个freeTextBox

以下是主要的代码:

  1      /**/ /********************************
  2     * 初始化浏览器状态
  3     * 指向about:blank
  4     * *****************************/

  5      private   void  Form1_Load( object  sender, System.EventArgs e)  {
  6      object obj = null;
  7      this.Show();
  8      this.axWb.Navigate("about:blank",ref obj,ref obj,ref obj,ref obj);      
  9      //等待完成动作
 10      while(axWb.ReadyState < SHDocVw.tagREADYSTATE.READYSTATE_INTERACTIVE)
 11        Application.DoEvents();
 12
 13      //初始化html编辑器
 14      InitHtmlEditor();
 15    }

 16
 17      /**/ /*******************************
 18     * 这里是核心方法
 19     * 完全调用IE自身的html编辑功能
 20     * 可以看到,我采用了一种兼容的
 21     * 方式,用Frame(框架),这样
 22     * 的话,默认安装的Windows 98都
 23     * 支持html编辑功能;
 24     * 关键代码如下:
 25     * frame.document.designMode = "on";
 26     * 表示开启设计模式
 27     ******************************/

 28      private   void  InitHtmlEditor() {
 29      string sw = "";
 30      sw += "<html>\r\n";
 31      sw += "<script language=javascript>\r\n";
 32      sw += " function loadSet(){\r\n";
 33      sw += "  var frame=document.getElementById(\"i-frame\").contentWindow;\r\n";
 34      sw += "  frame.document.designMode = \"on\";\r\n";
 35      sw += "  frame.document.open();\r\n";
 36      sw += "  frame.document.write(\"<html><font color=red>hello 大家好啊!<br>我是S.F. <br>";
 37      sw += "  <a href=\\\"http://www.cnblogs.com/chinasf\\\">欢迎访问我的weblog</a></font></html>\");\r\n";
 38      sw += "  frame.document.close();\r\n";
 39      sw += " }\r\n";
 40      sw += " function setBlod(obj){\r\n";
 41      sw += "  document.getElementById(\"i-frame\").contentWindow.document.execCommand(\"bold\");\r\n";
 42      sw += " }\r\n";
 43      sw += "</script>\r\n";
 44      //这里加入了一个html的button,也就是说,你可以把web模式的html编辑器的代码完全copy进来
 45      sw += "<body onload=\"loadSet()\" scroll=\"yes\"><button onclick=\"setBlod(this);\">Blod</button>\r\n";
 46      sw += "<iframe id=\"i-frame\" frameBorder=\"1\" width=\"640\" height=\"480\"></iframe>\r\n";
 47      sw += "</body></html>\r\n";
 48
 49      //写入浏览器
 50      WriteHtml(sw);
 51    }

 52
 53      private   void  WriteHtml( string  s) {
 54      //内存流,用于转换string
 55      MemoryStream ms = new MemoryStream();
 56      try{
 57        byte[] htmlcode = System.Text.Encoding.Default.GetBytes(s);
 58        ms.Write(htmlcode,0,htmlcode.Length);
 59        Stream dataStream = ms;
 60        //恢复指针位置
 61        dataStream.Seek(0,0);
 62
 63        if(axWb.Document!=null){
 64          //转换接口,并转换为IStream
 65          (axWb.Document as UnsafeNativeMethods.IPersistStreamInit).Load(new UnsafeNativeMethods.ComStreamFromDataStream(dataStream));
 66        }

 67      }
finally{
 68        ms.Close();
 69      }

 70    }

 71
 72      private   void  button1_Click( object  sender, System.EventArgs e)  {
 73      //获取document,在IHTMLDocument2中取得桢
 74      mshtml.IHTMLDocument3 idoc = (mshtml.IHTMLDocument3)axWb.Document;
 75      mshtml.IHTMLFrameBase2 fb= (mshtml.IHTMLFrameBase2)idoc.getElementById("i-frame");
 76      object obj=null;
 77      fb.contentWindow.document.execCommand("bold",true,obj);
 78    }

 79
 80      private   void  button3_Click( object  sender, System.EventArgs e)  {
 81      //获取document,在IHTMLDocument2中才有body.style
 82      mshtml.IHTMLDocument2 idoc = (mshtml.IHTMLDocument2)axWb.Document;
 83      //指定为IHTMLStyle3,才可以定制滚动条颜色
 84      mshtml.IHTMLStyle3 istyle = (mshtml.IHTMLStyle3)idoc.body.style;
 85      istyle.scrollbarArrowColor = "#0099FF";
 86      istyle.scrollbar3dLightColor = "#FFFFFF";
 87      istyle.scrollbarDarkShadowColor = "#0099FF";
 88      istyle.scrollbarFaceColor = "#99CCFF";
 89      istyle.scrollbarHighlightColor = "#0099FF";
 90      istyle.scrollbarShadowColor = "#0099FF";
 91      istyle.scrollbarTrackColor = "#FFFFFF";
 92
 93    }

 94
 95      private   void  button2_Click( object  sender, System.EventArgs e)  {
 96      //查看源码,文本方式
 97      mshtml.IHTMLDocument3 idoc = (mshtml.IHTMLDocument3)axWb.Document;
 98      mshtml.IHTMLFrameBase2 fb= (mshtml.IHTMLFrameBase2)idoc.getElementById("i-frame");
 99      MessageBox.Show(fb.contentWindow.document.body.innerText);
100    }

101
102      private   void  button4_Click( object  sender, System.EventArgs e)  {
103      //查看源码,HTML方式
104      mshtml.IHTMLDocument3 idoc = (mshtml.IHTMLDocument3)axWb.Document;
105      mshtml.IHTMLFrameBase2 fb= (mshtml.IHTMLFrameBase2)idoc.getElementById("i-frame");
106      MessageBox.Show(fb.contentWindow.document.body.innerHTML);
107    }


这里下载完整工程代码。

2005年4月26日 欢迎指点批评!演示是很简陋的

目录
相关文章
|
2月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
2月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
93 3
|
2月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
136 4
|
3月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
60 1
|
3月前
|
XML JavaScript 数据格式
jquery中html()方法的使用
jquery中html()方法的使用
35 1
|
3月前
|
JavaScript 前端开发
DOM的概念?获取html元素的方法有哪些?
DOM的概念?获取html元素的方法有哪些?
43 0
|
3月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
36 0
|
3月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
64 0
|
6月前
|
开发工具
vi编辑器,现在vi\vim是文本文件进行编辑的最佳选择,Vim是vi的加强的版本,兼容vi的所有指令,vim编辑器有三种工作模式,一开始进入的是命令模式,命令模式i是插入的意思,两下y+p复制内容
vi编辑器,现在vi\vim是文本文件进行编辑的最佳选择,Vim是vi的加强的版本,兼容vi的所有指令,vim编辑器有三种工作模式,一开始进入的是命令模式,命令模式i是插入的意思,两下y+p复制内容
|
7月前
|
开发工具
Vim 编辑器:高效文本编辑的瑞士军刀
**Vim 概览:** Vim 是一个功能丰富的文本编辑器,以其高度可定制性著称。文章介绍了 Vim 的高效使用技巧,包括快捷打开文件、命令行模式下的常用命令、查找与替换、删除和复制文本。还讨论了配置 `.vimrc` 文件以自定义设置,如改变 leader 键、设置缩进和高亮,并展示了安装插件如 vim-airline 和 vim-snazzy 的方法。通过这些技巧,用户能提升 Vim 使用效率。
82 5