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
以下是主要的代码:
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接口的声明和一些相关的小方法的更多相关文章
- 转:微信开发获取地理位置实例(java,非常详细,附工程源码)
微信开发获取地理位置实例(java,非常详细,附工程源码) 在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...
- 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析
提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...
- 5.Xilinx RapidIO核例子工程源码分析
https://www.cnblogs.com/liujinggang/p/10091216.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:V ...
- Unity3D工程源码目录
2-0 暗黑破坏神3 链接:http://pan.baidu.com/s/1dEAUZoX 密码:cly4 2-1 炉石传说 客户端加服务器端 链接:http://pan.baidu.co ...
- [QT] - 图片查看器(数码相框)#工程源码
简介: 大学期间弄的一个小软件,当时是将该软件移植到嵌入式开发板使用的,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件 ] [ 打开图片 ] [ 图片可放大. ...
- [QT] - HTTP文件传输服务器#工程源码
简介: 大学时期学习弄的一个小软件,当初做的目的是在实验室的局域网内方便同学之间文件的传输,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件,选择IP及需绑定的 ...
- [QT] - MjpegStreamer客户端(简易版)#工程源码
简介: 大学时期学习弄的一个小软件,可以起到示例的作用,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 开发板启动 mjpg_streamer 服务器 ] [ 启动软件 ...
- 怎么理解一个规模大且结构复杂的c工程源码
很久以前,当要着手一个规模很大,结构复杂的c工程源码时,总是感觉无从下手.这个时候,一般google一下”XX源码分析“.当这个源码是很广泛使用的时,这样到也能得到不少启发:很不幸,经常要接触一些很少 ...
- 仿爱乐透android客户端界面实现(附工程源码)
最近研究了爱乐透android客户端的界面,感觉它的界面布局在一般开发中具有代表性.难点在于复杂的布局实现. 界面实现主要采用了以下方式: 注意:版本支持:android2.2以上,低版本要改动源码哦 ...
随机推荐
- 又一次认识HTML,CSS,Javascript 之node-webkit 初探
今天我们来系统的.全面的 了解一下前端的一些技术,将有助于我们写出 更优秀的 产品 出来. 什么是HTML? HTML 是用来描写叙述网页的一种语言. HTML 包括一些根节点.子节点,文本节点.属性 ...
- C# 经典排序算法大全
C# 经典排序算法大全 选择排序 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- 基于RDP开源许可rdesktop基本介绍
**************************************************************************************************** ...
- Python 获得Facebook用户有一个共同的兴趣Friends
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-13 @author: guaguastd @name: c ...
- 设备MyEclipse6.5的maven
设备MyEclipse6.5的maven A.首先删除MyEclipse6.5自带的maven 删除步骤: 1.关闭MyEclipse,进入MyEclipse6.5安装目录,搜索maven,将搜索结果 ...
- T-SQL技术收集——删除重复数据
原文:T-SQL技术收集--删除重复数据 在工作和面试中,经常出现如何查询或者删除重复数据的问题,如果有主键,那还好办一点,如果没有主键,那就有点麻烦. 当一个表上没有辅助键时,如果使用SSMS界面来 ...
- 国内Android应用推广的六大主流方式
国内Android应用推广的六大主流方式 http://mobi.baike.com/article-19433.html 随着Android市场份额的飞速增长,越来越多的国内开发团队和公司開始投入A ...
- ADT后windows菜单未找到Android SDK Manager和Android Virtual Device Manager该解决方案的选择
打开今天凌晨ADT准备编译androidproject的时候,突然发现windows菜单下的Android SDK Manager和Android Virtual Device Manager选项不见 ...
- 开展.net mvc3遇到怪事+解
发展到今天.net mvc3遇到怪事. 使用Firefox浏览器.打开index页,求index该控制器是很多次,代码查询数据库的多个运行.server减速. 而且没有刷新页面,随着时间的推移有十二请 ...
- eclipse环境下如何配置tomcat
eclipse环境下如何配置tomcat 很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,通过图文解说的方法,最直观的向大家演示一遍该配置过 ...