原文: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";


\"></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);


,htmlcode.Length);


 59        Stream dataStream = ms;


 60        //恢复指针位置


);


 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);


    }





    private void button4_Click(object sender, System.EventArgs e) {


      //查看源码,HTML方式


      mshtml.IHTMLDocument3 idoc = (mshtml.IHTMLDocument3)axWb.Document;


      mshtml.IHTMLFrameBase2 fb= (mshtml.IHTMLFrameBase2)idoc.getElementById("i-frame");


      MessageBox.Show(fb.contentWindow.document.body.innerHTML);


    }

这里下载完整工程代码。




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

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

  1. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  2. 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析

    提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...

  3. 5.Xilinx RapidIO核例子工程源码分析

    https://www.cnblogs.com/liujinggang/p/10091216.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:V ...

  4. Unity3D工程源码目录

    2-0    暗黑破坏神3 链接:http://pan.baidu.com/s/1dEAUZoX 密码:cly4 2-1    炉石传说 客户端加服务器端 链接:http://pan.baidu.co ...

  5. [QT] - 图片查看器(数码相框)#工程源码

    简介: 大学期间弄的一个小软件,当时是将该软件移植到嵌入式开发板使用的,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件 ] [ 打开图片 ] [ 图片可放大. ...

  6. [QT] - HTTP文件传输服务器#工程源码

    简介: 大学时期学习弄的一个小软件,当初做的目的是在实验室的局域网内方便同学之间文件的传输,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件,选择IP及需绑定的 ...

  7. [QT] - MjpegStreamer客户端(简易版)#工程源码

    简介: 大学时期学习弄的一个小软件,可以起到示例的作用,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 开发板启动 mjpg_streamer 服务器 ] [ 启动软件 ...

  8. 怎么理解一个规模大且结构复杂的c工程源码

    很久以前,当要着手一个规模很大,结构复杂的c工程源码时,总是感觉无从下手.这个时候,一般google一下”XX源码分析“.当这个源码是很广泛使用的时,这样到也能得到不少启发:很不幸,经常要接触一些很少 ...

  9. 仿爱乐透android客户端界面实现(附工程源码)

    最近研究了爱乐透android客户端的界面,感觉它的界面布局在一般开发中具有代表性.难点在于复杂的布局实现. 界面实现主要采用了以下方式: 注意:版本支持:android2.2以上,低版本要改动源码哦 ...

随机推荐

  1. ti8168 eth0 启动

    ti8168 原始文件系统进去后没有网络eth0接口,为了有该接口须要配置/etc/network/interfaces 文件 详细配置例如以下(红色要配置) # /etc/network/inter ...

  2. ubuntu 下搭建apache+python的运行环境

    ubuntu下怎么搭建apache+python运行环境,可以参考http://www.01happy.com/ubuntu-apache-mod-python/ ,这里只是简单的记录下步骤,本文主要 ...

  3. JBoss配置解决高并发连接异常问题(转)

    这两天一个项目在做压力测试的时候,发现只要并发数超过250个,连续测试两轮就会有连接异常出现,测试轮数越多出现越频繁,异常日志如下: Caused by: com.caucho.hessian.cli ...

  4. 分散式-ubuntu12.04安装hadoop1.2.1

    在hadoop1.2.1被预装在一份报告中安装说明java.我装了很多的版本号java以及许多的版本号hadoop,然后发现oracle-java7与hadoop1.2.1能够匹配. 一,安装详细过程 ...

  5. 使用一个T-SQL语句批量查询数据表占用空间及其行数

    原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...

  6. 当向后台插入或读取JSON数据遇见回车时

    今天在项目中发现.当插入或读取JSON数据时遇见回车符.返回JSON数据格式时会报错(firebug里体现为乱码),百度了一下发现JSON不支持字符串里存在回车! 解决的方法: 在向接口插入带json ...

  7. Android 按下电源按钮关闭小学习过程的整个长度

    Android 按下电源按钮关闭小学习过程的整个长度 近期研究了一下android关机跟又一次启动功能,看了一些长按电源键到弹出关机对话框,到真正关机的一系列处理过程. 首先还是来看看这个长按电源键都 ...

  8. Hadoop-2.2.0中国文献—— Web应用代理

    Web应用代理是YARN的一部分. 默认地,它会作为 Resource Manager(RM)的一部分来执行, 可是也能够配置成独立执行的模式.使用代理的原因就是减少通过YARN的web攻击的可能性. ...

  9. “GDI+ 发生一般错误” 解决方法

    System.Runtime.InteropServices.ExternalException: GDI+ 发生一般错误 对应的帐户没有写权限,给予帐户写权限 版权声明:本文博主原创文章,博客,未经 ...

  10. HDU 4125 Moles 段树+KMP

    意甲冠军: 特定n, 下面是一个1-n该装置. 下面的二进制字符串. 按给定的建立二叉树安排. 然后遍历树(根->左子树->根->右子树->根) 当遍历节点 如果右值为奇数入栈 ...