动手扩充FreeTextBox的功能
代码:C#
关键字:FreeTextBox、流媒体
出自:http://blog.csdn.net/foxmail/archive/2004/08/21/81096.aspx
摘要:最近一个项目要求可以在发表文章的时候能发布电影,当然不可能叫用户去写HTML代码了,于是决定扩充FreeTextBox的功能,即为它增加一个工具栏按钮,实现发布在线电影的功能。
FreeTextBox是.Net环境下广为流行的RichText编辑器,CSDN的blog在发表文章时就是使用的它。
最近一个项目要求可以在发表文章的时候能发布电影,当然不可能叫用户去写HTML代码了,
于是决定扩充FreeTextBox的功能,即为它增加一个工具栏按钮,实现发布在线电影的功能。
没有看相关的文章,直接打开FreeTextBox的源代码工程,发现工程结构组织还是比较好,
源代码也有注释,注意到ToolbarControls目录下面有ToolbarItem.cs、ToolbarItems.cs和
ToolbarButton.cs ,肯定是在这里了。粗看了一下代码,
发现在ToolbarItems.cs有很多静态属性,分别返回很多ToolbarButton。
其中有很熟悉的:
/// <summary>
/// Returns a ToolbarButton with InsertImageFromGallery JavaScript functions builtin
/// </summary>
public static ToolbarButton InsertImageFromGallery {
get {
ToolbarButton button = new ToolbarButton("插入图片(来自图片库)","insertimagefromgallery","FTB_InsertImageFromGallery_CLIENTID");
button.ScriptBlock = @"<script language=""JavaScript"">
function FTB_InsertImageFromGallery_CLIENTID(editor,htmlmode) {
if (htmlmode) return;
editor.focus();
obj = FTB_GetRangeReference(editor);
if (obj.tagName == 'IMG') {
editor.document.execCommand('insertimage',1,'');
return;
}
var folder = 'IMAGEGALLERYPATH';
var galleryscript = FTB_HelperFilesPath + 'ftb.imagegallery.aspx?rif='+folder+'&cif='+folder;
if (FTB_HelperFilesParameters != '') galleryscript += '&' + FTB_HelperFilesParameters;
imgArr = showModalDialog(galleryscript,window,'dialogWidth:560px; dialogHeight:500px;help:0;status:0;resizeable:1;');
if (imgArr != null) {
imagestring = '<IMG SRC=""' + imgArr['filename'] + '"" HEIGHT=' + imgArr['height'] + ' WIDTH=' + imgArr['width'] + ' BORDER=0>';
sel = editor.document.selection.createRange();
sel.pasteHTML(imagestring);
} else {
alert(""您没有选择图片。"");
}
}
</script>";
return button;
}
}
没错,这段代码就是为什么你按下插入图片(来自图片库)按钮,会出来一个网页对
话框,让你选择图片的原因。注意看其中的
var galleryscript = FTB_HelperFilesPath + 'ftb.imagegallery.aspx?rif='+folder+'&cif='+folder;
if (FTB_HelperFilesParameters != '') galleryscript += '&' + FTB_HelperFilesParameters;
imgArr = showModalDialog(galleryscript,window,'dialogWidth:560px; dialogHeight:500px;help:0;status:0;resizeable:1;');
整个FreeTextBox的编辑操作几乎都是在客户端完成,这是它的高明之处,否则动不动
就PostBack,服务器受不了,写文章的人也受不了。
既然找到了按钮功能是如何实现的,就依样画葫芦,增加如下代码:
public static ToolbarButton InsertMovie
{
get
{
ToolbarButton button = new ToolbarButton("插入电影","InsertMovie","FTB_InsertMovie_CLIENTID");
button.ScriptBlock = @"<script language=""JavaScript"">
function FTB_InsertMovie_CLIENTID(editor,htmlmode) {
if (htmlmode) return;
editor.focus();
var filmURL = window.prompt('支持电影格式为:avi、mpg、mpeg、asf、wmv、ra和ram等。/n请输入电影地址','Http://');
if (filmURL != null) {
filmstring = '<object classid=""clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"" id=""WindowsMediaPlayer1"">';
filmstring +='<param name=""URL"" value=""'+filmURL+'"">';
filmstring +='<param name=""AutoSize"" value=""0"">';
filmstring +='<param name=""AutoStart"" value=""0"">';
filmstring +='</object>';
sel = editor.document.selection.createRange();
sel.pasteHTML(filmstring);
} else {
//alert(""您没有选择图片。"");
}
}
</script>";
return button;
}
}
其中var filmURL = window.prompt('支持电影格式为:avi、mpg、mpeg、asf、wmv、ra和ram等。/n请输入电影地址','Http://');
得到用户输入的电影地址,考虑到项目进度要求,没有采用图片库那种方式,而是直接输入电影网址的方式。
按钮做好了,如何让它出现在工具栏呢?好办。
搜索InsertImageFromGallery,我只要找到人家怎么加的,我就可以加了。
结果只出来13个结果,看到其中有几个是Support/ToolbarGenerator.cs,可以肯定,就是这了。
点击搜索结果,可以看到如下代码:
public class ToolbarGenerator {
//Toolbar layouts
public static string DefaultConfigString = "Bold,Italic,Underline,Strikethrough;Superscript,Subscript,RemoveFormat|FontFacesMenu,FontSizesMenu,
FontForeColorsMenu|JustifyLeft,JustifyRight,JustifyCenter,JustifyFull;BulletedList,NumberedList,Indent,Outdent;
CreateLink,Unlink,InsertImageFromGallery,InsertTable,InsertRule|Cut,Copy,Paste;Undo,Redo,Print,ieSpellCheck";
public static string AlternateConfigString = "Save,Print,Undo,Redo,WordClean,InsertTable|ParagraphMenu,FontFacesMenu,FontSizesMenu,FontForeColorPicker,
FontBackColorPicker,SymbolsMenu|Bold,Italic,Underline,Strikethrough;Superscript,Subscript,RemoveFormat|
JustifyLeft,JustifyRight,JustifyCenter,JustifyFull;BulletedList,NumberedList,Indent,Outdent;CreateLink,Unlink,
InsertImageFromGallery,InsertRule|Cut,Copy,Paste,ieSpellCheck";
public static string EnableAllConfigString = "ParagraphMenu,FontFacesMenu,FontSizesMenu|FontForeColorsMenu,FontForeColorPicker,FontBackColorsMenu,
FontBackColorPicker|Bold,Italic,Underline,Strikethrough,Superscript,Subscript;InsertImageFromGallery,CreateLink,
Unlink,RemoveFormat|JustifyLeft,JustifyRight,JustifyCenter,JustifyFull;BulletedList,NumberedList,Indent,Outdent|
Cut,Copy,Paste,Delete;Undo,Redo,Print,Save|StyleMenu,SymbolsMenu,InsertHtmlMenu|InsertRule,InsertDate,
InsertTime,WordCount,ieSpellCheck,WordClean,InsertTable";
public static string MinimalConfigString = "Bold,Italic,Underline";?
用过FreeTextBox的朋友都知道,FreeTextBox有几种工具栏的模式,显然,这里就是定义不同工具栏出现不同按钮的地方,除了最后一种很少按钮的模式以外,其它的都有InsertImageFromGallery,而CSDN的工具栏里面没有从图片库插入图片这个按钮,看来我们CSDN的开发人员也已经改过这些代码:)
上面的代码只不过是定义一些字符串,肯定还有解析的地方,在搜索结果里,还有这么一段:
case "insertimagefromgallery":
return ToolbarItems.InsertImageFromGallery;
是了,就是在这里解析的。于是,再次依样画葫芦,加入如下代码
case "insertmovie":
return ToolbarItems.InsertMovie;
同时,修改定义部分为:
public static string EnableAllConfigString = "ParagraphMenu,FontFacesMenu,FontSizesMenu|FontForeColorsMenu,FontForeColorPicker,
FontBackColorsMenu,FontBackColorPicker|Bold,Italic,Underline,Strikethrough,Superscript,Subscript;
InsertMovie,InsertImageFromGallery,CreateLink,Unlink,RemoveFormat|JustifyLeft,JustifyRight,JustifyCenter,
JustifyFull;BulletedList,NumberedList,Indent,Outdent|Cut,Copy,Paste,Delete;Undo,Redo,Print,Save|StyleMenu,
SymbolsMenu,InsertHtmlMenu|InsertRule,InsertDate,InsertTime,WordCount,ieSpellCheck,WordClean,InsertTable";
即在InsertImageFromGallery旁边加入了InsertMovie,
编译,一次通过,把生产的FreeTextBox.DLL复制到项目文件夹,一运行发表文章,成功!
效果如下图:
图中用黄圈圈起来的按钮就是我们增加的发布电影功能,试一下,你也可以为FreeTextBox增加各种各样的功能,开发出独具个性的产品:)
相关文章:

《防患未然:实施情报先导的信息安全方法与实践》——3.3 攻击剖析
本节书摘来自华章计算机《防患未然:实施情报先导的信息安全方法与实践》一书中的第3章,第3.3节,作者:[美] 艾伦利斯卡(Allan Liska) 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.3 攻击剖析 为了开发更…

c#.net常用函数和方法集
1、DateTime 数字型 System.DateTime currentTime new System.DateTime(); 1.1 取当前年月日时分秒 currentTimeSystem.DateTime.Now; 1.2 取当前年 int 年currentTime.Year; 1.3 取当前月 int 月currentTime.Month; 1.4 取当前日 int 日currentTime.Day; 1.5 取当…
员工培训:如何制定以数据为依据的业务决策
作者 | Kamy Anderson翻译| Katie,责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国普华永道的研究表明,高度数据驱动的组织在决策方面取得显着改善的可能性要高三倍。不幸的是,高达62%的高管仍然更多地依赖经验和直觉…

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc
阅读目录: 一. 一个没有使用IoC的例子 二. 当需求发生变动时,非IoC遭遇到的困境 三. 使用IoC彻底解决问题 四. 总结 一、一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转。要理解控制反转,可以看看非控制反转的一个例…

【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!
喜讯喜讯!为了酬谢广大学员。CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课,让您度过一个充实的暑假~ 參与本次公开课,即有机会获得50C币! 答疑公开课时间:7月18日 晚7:30-9:30 答疑主题:姜雪伟3D…

Linux0.11内核引导启动过程概述
Linux0.11仅支持x86架构。它的内核引导启动程序在文件夹boot内,共有三个汇编代码文件。按照启动流程依次是: (1)bootsect.s。boot是启动引导的意思,sect即sector,是扇区的意思,二者合在一起启动…
用Python分析5000+抖音大V,粉丝最喜欢的视频类型是它
作者 | 小F来源 | 法纳斯特头图 | CSDN下载自视觉中国最近,小F在知乎上看到一个关于抖音的问题。里面提到了,目前我国人均每天刷短视频110分钟。看这数据,看来小F又被平均了。不过老实说,只要一打开抖音,小F确实是有一…

JSTL 读取数组 和 字符串连接
2019独角兽企业重金招聘Python工程师标准>>> JSTL读取数组: 从后台取得一个字符串,如:AA-50-3,通过-划分成字符串数组。然后读取每个字符串。 <c:set var"cle" value"${fn:split(AA-50-3,-)}"…
《Photoshop Lab修色圣典(修订版)》—第1课1.7节言归正传
本节书摘来自异步社区《Photoshop Lab修色圣典(修订版)》一书中的第1课1.7节言归正传,作者【美】Dan Margulis,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 言归正传Photoshop Lab修色圣典(修订版)上面的讨论说明,与其他方法相比&#x…

PHP获取当前时间差8小时的问题
<?php echo date("Y-m-d H:i:s"); //当前时间 ?> 这个方法获取的时间和标准时间差8小时;从php5.1.0开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的也就是显示的时间(无论用什么php命令…

四连通,和八连通的详解(MATLAB)
转至:http://www.cnblogs.com/xiaojidan/archive/2012/08/20/2647261.html 功能:标注二进制图像中已连接的部分。语法:L bwlabel(BW,n) [L,num] bwlabel(BW,n) 其中BW为输入图像;N可取值为4或8表示连接四连通或八连通区域;NUM为找到的连通…
梅花桩上练真功,腾讯公布机器人移动技术探索新突破
出品 | AI科技大本营11月20日,腾讯公布了其在移动机器人研究方面的新进展:四足移动机器人 Jamoca 和自平衡轮式移动机器人首次对外亮相。Jamoca 是国内首个能完成走梅花桩复杂挑战的四足机器人,自平衡轮式移动机器人的相关研究成果还入选了机…

《Redis入门指南(第2版)》一第2章 准备
本节书摘来异步社区《Redis入门指南(第2版)》一书中的第2章,作者: 李子骅 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。 第2章 准备 Redis入门指南(第2版)“…
深度学习中的注意力机制(二)
作者 | 蘑菇先生 来源 | NewBeeNLP目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往倾向于根据需要选择性的去…

DataGrid列操作
DataTable检测是否存在某个DataColumn 1.if (dt.Columns.Contains("aa") true){ //存在aa} 2.foreach(DataColumn mDCol in dt.Columns) { if(mDCol.ColumnName"aa") { //存在aa } } 怎么样移除DataGrid列private void OnDataBound(object send…

【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...
HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket。现在把 HP-Socket 的所有代码向大众公开,希望能对大家有所帮助;另外,为了让大家能更方便的学习 HP-Socket,因此…

【数据库优化专题】MySQL视图优化(一)
本期数据库优化专题分享,为大家带来的是DBA社群MySQL领域原创专家——李海翔所著的MySQL视图优化系列文章。以下是第一部分的内容,未完部分敬请关注后续更新。 专家简介 李海翔 网名:那海蓝蓝 DBA社群MySQL领域原创专家 从事数据库研发、数…

使用Repeater的Template
.NET FX提供了一个方法,就是使用Template来在程序运行时对Repeater的显示进行控制. 这里我就不多说了,可以去看MSDN中的相关资料.(嘿嘿,其实我也没搞多少 )..其实主要是private void lc_DataBinding(object sender, EventArgs e)函数,在DataSource中的数据进行Bind的时候,每Bin…

获取文件最后修改时间的VC代码
作者:朱金灿来源:http://blog.csdn.net/clever101很多时候我们需要知道系统是什么时候编译生成的。我想到的一个直接的思路的是获取exe文件的最后修改时间。下面的一段代码可以做到这一点:CWinApp* pApp AfxGetApp();std::string strAppName…
BAT新风向标:程序员有福利了!
人工智能已成为新时代的风向标,如果你是对人工智能感兴趣的互联网工作者、大学生、研究生并期望在 AI 方向发展,建议你一定要深入学习一下人工智能。因为,未来将是人工智能的时代!为什么会有这个判断呢?第一࿰…

《C++代码设计与重用》——1.2 重用的神话
本节书摘来自异步社区出版社《Imperfect C中文版》一书中的第1章,第1.2节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 重用的神话 C代码设计与重用1.2 重用的神…

控件的呈现方法(Rendering)的内核
Asp.net中所有的控件都是从System.Web.UI.Control类,在control类中定义了三个与呈现有关的方法,分别是Render方法,RenderChildren方法和RenderControl方法.其中RenderControl方法是public的方法,先看看这三个方法的实现: Public void RenderControl(HtmlTextWriter writer) {//…
清华、北大教授同台激辩:脑科学是否真的能启发AI?
作者 | 高卫华出品 | AI科技大本营头图 | CSDN下载自视觉中国广义的智能科学是研究智能背后的科学,需要不断扩展科学研究范围,没有最后的疆域。但脑在几千年内的进化中都相对静止,因此脑科学是“自然科学最后的疆域”。脑科学是一个重要的研究…

CentOS 5 升级mysql5.1启动服务时报错
CentOS 5 升级mysql5.1启动服务时报错: [ERROR] Error message file /usr/share/mysql/english/errmsg.sys had only 481 error messages, but it should contain at least 641 error messages.解决方法是:1.mv /usr/share/mysql/english/errmsg.sys /us…

《JavaScript设计模式》——11.2 一切只因跨域
本节书摘来自异步社区《JavaScript设计模式》一书中的第11章,第11.2节,作者:张容铭著,更多章节内容可以访问云栖社区“异步社区”公众号查看 11.2 一切只因跨域 “哦,为什么会出现,什么是跨域?…
程序员:我不学Python了!!
总学不会Python的原因,归根结底只有一个——学习方法不对。 作为一个唯一将易用性与功能取得平衡的编程语言,无论是编程新手还是多年经验的BATJZ技术大牛,都无可否认如今Python对于一个程序员职业发展的重要性。 所以,你现在能在网…

Javascript Tip(1) 操作剪贴板
javascript可以轻松操作客户端剪贴板内容,不过只适用IE5以上浏览器 javascript可以使用window.clipboardData对象处理剪贴板内容 保存到剪贴板的方法 setData(param1, param2) param1 :数据类型 text 或 URL等. param2 :数据内容 从剪贴板读出数据的方法 getdata(p…

MySQL 自增ID
http://hi.baidu.com/517898291/item/9cac18066030cac6905718e0 http://jiangshuiy.iteye.com/blog/751060 Sina 转载: MySQL: Get next AUTO_INCREMENT value from/for table Note to self: To get the next auto_increment value from a table run this query: SE…

《算法基础:打开算法之门》一1.5 拓展阅读
本节书摘来自华章出版社《算法基础:打开算法之门》一书中的第1章,第1.5节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区“华章计算机”公众号查看 1.…
Python画出心目中的自己
作者 | 李秋键责编 | 晋兆雨头图 | CSDN下载自视觉中国引言:人脸图像的生成在各个行业有着重要应用,例如刑事调查、人物设计、教育培训等。然而一幅逼真的人脸肖像,对于职业画家也要至少数小时才能绘制出来;对于从未接触过绘画的新…