zoukankan      html  css  js  c++  java
  • 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日 欢迎指点批评!演示是很简陋的

  • 相关阅读:
    Airflow 使用 Celery 时,如何添加 Celery 配置
    什么是唯品会JIT业务
    Linux 性能优化排查工具
    HttpClient 报错 Invalid cookie header, Invalid 'expires' attribute: Thu, 01 Jan 1970 00:00:00 GMT
    如何使用 Enterprise Architect 画 UML
    通过maven profile 打包指定环境配置
    Git 使用总结
    Git 分支模型
    本地Windows环境Dubbo搭建测试
    makefile
  • 原文地址:https://www.cnblogs.com/Chinasf/p/145773.html
Copyright © 2011-2022 走看看