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

目录
相关文章
|
18天前
|
定位技术
时尚的联系我们表单HTML模板(源码)
一款时尚的联系我们表单Html模板,带地图和所在位置,输入基本信息和信息发送,看起来很漂亮的联系我们页面。
30 1
时尚的联系我们表单HTML模板(源码)
|
6天前
|
前端开发 JavaScript
用HTML CSS JS打造企业级官网 —— 源码直接可用
必看!用HTML+CSS+JS打造企业级官网-源码直接可用,文章代码仅用于学习,禁止用于商业
36 1
|
12天前
|
移动开发 HTML5
HTML5熊猫弹跳手机小游戏源码
一款html5手机端小游戏源码,熊猫跳跃小游戏源码下载。熊猫脚底有弹簧,长按变化力度跳跃,计分游戏,html5手机熊猫也疯狂小游戏源代码。
33 5
|
14天前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
27 4
|
15天前
|
移动开发 HTML5
HTML5实现手机端红包下落抢红包特效源码
HTML5实现手机端红包下落抢红包特效源码是一款手机移动端的抢红包小游戏源码下载。红包像下雪一样,点击抓我呀,可以抢红包,需要此款代码的朋友们可以前来下载使用。本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码。
31 4
|
15天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
47 3
|
13天前
|
移动开发 HTML5
html5+three.js公路开车小游戏源码
html5公路开车小游戏是一款html5基于three.js制作的汽车开车小游戏源代码,在公路上开车网页小游戏源代码。
40 0
html5+three.js公路开车小游戏源码
|
21天前
|
前端开发 JavaScript
Canvas三维变化背景动画HTML源码
Canvas三维变化背景动画HTML源码
23 5
|
21天前
轻量级消息弹框HTML源码
轻量级消息弹框插件特效源码是一段不错的消息弹框代码,支持设置通知类型、动画、字体、位置等等属性,可定制程度较高,进行适当扩展等,欢迎对此段代码感兴趣的朋友参考使用。
27 0
轻量级消息弹框HTML源码
|
1月前
|
C#
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
46 9