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

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

时间: 2025-01-02 15:49:24

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

Servlet实现对SQLServer数据库的增删改查(含工程源码)

本文实现了用MyEclipse,编写Servlet,实现对SQLServer数据库的增删改查,适合新手入门,文末提供工程文件源码下载. 1.新建数据库test以及表users 表users共四列(id,name,psd,tel) 具体操作步骤见上篇博文.具体操作步骤 2.新建工程Web Project工程0623p 3. 编辑WebRoot目录下的index.jsp 创建表单(序号.账号.密码.电话.操作),并读取当前数据库内容. 注意: 此处要导入sql_data.java包用于连接数据库(

MyEclipse+MVC(Struts)实现登录验证(含工程源码)

本文实现了用在MyEclipse下用MVC实现登录验证,适合新手入门,文末提供工程文件源码下载. 1. 新建工程Web Project工程0624mvc 2.选中工程,右键->MyEclipse->Add Struts Capabilities 如图   然后点击finish即可. 3. Form,Action and JSP         找到WebRoot/WEB-INF目录下的struts-config.xml文件,双击打开, 在空白区域,单击右键->New->Form,A

MyEclipse+Struts2登录验证(含工程源码)

本文实现了在MyEclipse下用Struts2查询SQLServer数据库实现登录验证,适合新手入门,文末提供工程文件源码下载. 1. 新建工程Web Project工程0624Struts2 2.Add Struts Capabilities 选中工程,右键->MyEclipse->Add Struts Capabilities,跳出的页面选择Struts 2.1 以及" /* ",再点击finish即可. 3.导入 sql_data.java,新建LoginActio

Log4j日志在java项目中的使用(附工程源码)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.关于Log4j日志 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行

给pdf文件添加防伪水印logo(附工程源码下载)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] pdf添加水印logo这种需求场景确实很少,有些时候一些销售单据生成pdf添加一个水印logo,做一个简单的防伪效果,虽然实际上并没有太大作用,但是产品经理说要,巴拉巴拉--省略一万字. 下面将源码分享给猿友们,有用就looklook,没用就转移视线吧. 一.效果展示 没加水印的pdf: 添加水印后的pdf: 这里截图效果可能不是很明显,有需要的猿友可以直接下载下面的源码压

View的Layout过程源码分析

/** * 文档描述: * View的Layout过程源码分析 * * 原创作者: * 谷哥的小弟 http://blog.csdn.net/lfdfhl * * 分析笔记: * View在经历过第一阶段的measure之后,进入到第二阶段layout. * 该阶段的目的是 * (1)设置View自身的大小和位置. * (2)设置View的子View大小和位置. * */ @SuppressWarnings({"unchecked"}) public void layout(int l

View的draw过程源码分析

/** * * 原创作者: * 谷哥的小弟 http://blog.csdn.net/lfdfhl * * 文档描述: * View的draw过程源码分析 * * 绘制过程分为六步: * * 1. Draw the background * 2. If necessary, save the canvas' layers to prepare for fading * 3. Draw view's content * 4. Draw children * 5. If necessary, dra

求助: 那位有.net 移动编程源码 分享一下,谢谢

问题描述 求助:那位有.net移动编程源码分享一下,急需学习,,,,, 解决方案 解决方案二:兄弟我最近建了一个ASP.NET学习,交流群[64989019],欢迎志同道合的朋友加入,一块学习,一起探讨,共同进步,成就人生!!

[Android]从Launcher开始启动App流程源码分析

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码分析 com.android.launcher.Launcher就是我们的Launcher页面了,可以看到Launcher其实也是一个Activity: public final class Launcher extends Activity implements View.OnClickListe