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:blank4
* *****************************/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
//内存流,用于转换string55
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
//转换接口,并转换为IStream65
(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.style82
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以上,低版本要改动源码哦 ...
随机推荐
- OAuth在WebApi
OAuth在WebApi中的使用,前后台分离的调用方式 前段时间由于公司架构服务层向WebApi转换,就研究了OAuth在WebApi中的使用,这中间遇到了很多坑,在此记录一下OAuth的正确使用方式 ...
- Java知多少(4)J2SE、J2EE、J2ME的区别
原文:Java知多少(4)J2SE.J2EE.J2ME的区别 1998年12月,SUN公司发布了Java 1.2,开始使用“Java 2” 这一名称,目前我们已经很少使用1.2之前的版本,所以通常所说 ...
- centos 彻底删除nodejs默认的安装文件
1> yum remove nodejs npm -y 2> cd /usr/local/lib 移除所有 node 和 node_modules目录 cd /usr/local/in ...
- iOS8发展~Swift(三)UI详细解释
一个.总结 使用Swift去完成iOS的UI接口,事实上,目前的想法和OC实现几乎一致,只是在措辞非常大的差异,修改前更更大的个人控制.为有纯代码强迫症,所以接下来创建一个纯代码动项目,然后在此基础上 ...
- Solr/SolrCloud -error
状态 2014-08-20 10:46:22,356 INFO [coreZkRegister-1-thread-1] [org.apache.solr.cloud.ShardLeaderElecti ...
- [Cocos2d-x]在Cocos2d-x 3.x如何通过版本号WebSocket连接server数据的传输
WebSocket 首先新建一个空的目录,通过npm安装nodejs-websocket: npm install nodejs-websocket 新建app.js文件: var ws = requ ...
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...
- 【Spark亚太研究院系列】Spark道路的真正的主人-第一章 构建Spark星团(第五步)(6)
结束historyserver例如,下面的命令可以看到: 第四步:验证Hadoop分布式集群 首先在hdfs文件系统上创建两个文件夹.创建步骤例如以下所看到的: watermark/2/text/aH ...
- android键盘锁定问题
android经常使用KeyguardLock解锁.但需要使用后打电话reenableKeyguard()锁定被解除.否则,会导致其他进程无法锁定屏幕,使用相同的WakeLock唤醒屏幕后还需要使用r ...
- 网络请求 http get post 一
Http 定义了与server交互的不同方法.最主要的方法有4种.各自是Get POST PUT DELETE ,URL 全称资源描写叙述符,我们能够这样觉得一个URL地址,一个URL地址,它用于描写 ...