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日 欢迎指点批评!演示是很简陋的

目录
相关文章
|
4月前
|
JavaScript 前端开发
DOM的概念?获取html元素的方法有哪些?
DOM的概念?获取html元素的方法有哪些?
48 0
|
4月前
|
XML JavaScript 数据格式
jquery中html()方法的使用
jquery中html()方法的使用
59 1
|
5月前
|
XML 前端开发 JavaScript
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
34 2
|
5月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
72 2
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
5月前
|
存储 编解码 前端开发
HTML颜色的性能优化方法
在网页开发中,虽然颜色选择并非主要性能瓶颈,但合理的颜色优化仍可提升渲染效率与用户体验。本文介绍十种实用技巧,如使用CSS渐变代替图片、运用CSS变量存储颜色、合理选择颜色格式、减少页面颜色种类、按需加载样式表等,帮助改善网页性能。尽管单独来看颜色优化的影响有限,但综合应用这些技巧能够有效提升网页加载速度及整体体验。
|
5月前
|
JavaScript 前端开发
HTML 表单和输入与按钮的联动方法汇总
在HTML中,通过JavaScript可以轻松实现表单与输入、按钮的互动。本文介绍了基本表单结构,并展示了如何用JS处理按钮点击、表单提交、动态禁用按钮、表单验证以及使用AJAX和jQuery简化代码等技巧,帮助你更好地控制和优化表单功能。
|
5月前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
268 12
|
5月前
|
XML 前端开发 JavaScript
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
41 0
|
5月前
|
安全 C# 开发者
C# 一分钟浅谈:文件操作与文件流详解
【9月更文挑战第4天】在日常开发中,文件的读写是基本而重要的任务。C# 通过 `System.IO` 命名空间提供了多种工具,如 `FileStream`、`StreamReader` 和 `StreamWriter` 等,用于处理文件和流。本文从基础概念入手,详细介绍了这些类的使用方法,并讨论了常见错误及其避免策略,包括文件不存在、权限问题和文件被占用等。通过示例代码,展示了如何创建、读取文件以及进行二进制数据操作,并强调了异常处理和性能优化的重要性。掌握这些技巧对于提升编程能力至关重要。
262 2
|
6月前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
85 0

热门文章

最新文章