[转帖]FreeTextBox添加自定义按钮


[转帖]FreeTextBox添加自定义按钮


大家都知道FreeTextBox现在的版本是不开放源代码的,如果你想给它增加一些自己的东西,
看起来会比较麻烦一些,至少没有那些开源版本那样直观,但这并不能妨碍我们给FreeTextBox
添加我们自己的按钮。

       那么究竟怎么做才可以把我们需要的按钮制作成像其他按钮一样安静的放在那里,等待我们
去使用它呢?下面就介绍我的实现过程。

       我的初步想法是,FreeTextBox应该支持我们这样做,所以它可能已经给我们留了一些属性或
者Button集合类似的东西,让我们轻松把我们自己的按钮加到它的这个大家庭中。如果推断正确
的话,很明显,我们需要做的工作为:

1)  制作我们自己的按钮

2)  把我们的按钮添加到FreeTextBox的Button集合当中

那么就让我们去验证一下我们的想法吧。这个验证的过程,就是我们认知和熟悉FreeTextBox的一
个过程,我想最快的路无疑是看控件的作者留给我们的一些文档啦,FreeTextBox的作者很理解他
的客户的想法,所以我很快在下载的该控件的一些文件中找到了很需要的东西,那就是readme.txt
文本文件,打开,就可以看到作者对关于怎样使用FreeTextBox控件的一个很简单,但很有用的叙述,
阅读完后我已经觉得我当初的想法是正确的。在这里我们可以了解到,我们可以自定义我们的工
具栏的按钮(指增减已存在的按钮),方法有三种:

1)  ToolbarLayout String

2)  Procedurally

3)  Code (Page_Load or Code Behind)

这里我只简单列举一下,具体的可参考readme文本文件

接下来的事情,就让我们动手制作我们的按钮吧。这一次,我添加的是QQ表情图片,希望做到
的效果是点击工具栏上我自己的按钮,然后打开一个页面,选择表情,然后把表情图片返回到Free
TextBox中,就像其他按钮一样,我不希望我的按钮在工具栏上受到不平等的待遇。如何了解其他按
钮的工作原理呢?在没有源代码的情况下,这个可能会是一个麻烦事,但并不能阻挡我们探索事物
原理的好奇心,拿出我们的利器:Reflector吧,在这个时候他可以带给我们光明,我想反编译在这个
时候也该发挥一点力量了吧!用Reflector打开FreeTextBox DLL文件,展现在你面前的是该控件的类层
次结构,当然了,你可能会说,直接在vs.net的对象浏览器里就直接可以看到类层次结构,对,是这
样的。在这里我们不仅是查看FreeTextBox的类层次结构更为重要的是我们需要了解他自己的按钮是
如何实现的,因为Reflector可同时帮我们做这两件事情。打开FreeTextBoxControls你会发现他自己的
按钮类都在这里静静的等你呢,我找到了跟我需要制作的QQ表情类似的按钮:InsertImageFromGallery,
查看他的实现,你就会找到你需要的东西,首先,它是继承了ToolbarButton,查看他的构造函数,
你会发现如下的代码:

public InsertImageFromGallery() : base("Insert Image From Gallery", "insertimagefromgallery")
{
   base.isBuiltIn = true;
   base.isProFeature = false;
   base.BuiltInButtonOffset = 0x15;
   base.builtInScript = "this.ftb.InsertImageFromGallery();";
   base.className = "InsertImageFromGallery";
}

他看上去很懒,仅仅做了这些,这个对我们来说无疑是个好消息。当然,如果你对FreeTextBox比较熟悉的话,
你完全不必要这么做,你可以查看它的帮助文档,那里对他的类已经有了一个大致的说明,这个文档你可以
很轻松的从其官方网站获得。代码虽然不多,但我们仍需要好好研读,好好推敲,只有这样我们才可以理解
他的按钮的工作原理。按照平常的思维,如果我们抛开FreeTextBox,单独去实现我前面提到的那个需求,我
想应该会很简单,思路就是给按钮绑定一个客户端代码,当按钮被触发时,这段客户端代码就会执行,而我们
想让按钮做的工作也就是在这段客户端代码里实现。思路是一样的,FreeTextBox的按钮也还是按照这样一个思
路来完成它的工作的。为了验证我的想法,在FTB-FreeTextBox.js文件里你可以找到this.ftb.InsertImageFromGallery()
这个函数,它的代码如下:

FTB_FreeTextBox.prototype.InsertImageFromGallery = function() {
   
   url = this.imageGalleryUrl.replace(/\{0\}/g,this.imageGalleryPath);
   url += "&ftb=" + this.id;
   
   var gallery = window.open(url,’gallery’,’width=700,height=600,toolbars=0,resizable=1’);
   gallery.focus();
}

当然了,FreeTextBox现在的版本已经把这些代码做为嵌入资源,编译到dll文件里了,你可以通过Free
TextBox的属性JavaScriptLocation来改变其读取这些资源的来源。(按钮的图片也一样)理解了这些以
后就可以做自己的按钮啦,创建自己的类文件,让它也继承ToolbarButton,实现自己类的构造函数,
以下是我的按钮的实现代码:

using System;
using FreeTextBoxControls;
namespace FreeTextBoxControls
{
   /**//// <summary>
   /// InsertQQ 的摘要说明。
   /// </summary>
   public class InsertQQ:ToolbarButton
   {
      public InsertQQ(): base("Insert QQ", "insertqq")
      {
         this.ButtonImage = "QQ";
         this.ScriptBlock = "this.ftb.InsertQQ();";
         this.CommandIdentifier = "InsertQQ";
         this.FunctionName = "InsertQQ";
         this.Title = "插入表情";
      }
   }
}

相应的,在FTB-FreeTextBox.js添加类似的客户端处理代码,我的按钮的代码如下:

/**//*插入QQ表情*/
FTB_FreeTextBox.prototype.InsertQQ = function()
{
   var myUrl = ’InsertQQImages.aspx’;
   var myQQ = window.showModalDialog(myUrl,’qq’,’dialogWidth=160px;dialogHeight=170px;status=no’);
   
   if(myQQ != undefined)
   {
      var doc = this.designEditor.document;
      var image = doc.createElement("img");
      image.src = myQQ;
      this.designEditor.focus();
      var sel = this.GetSelection();
      var range = this.CreateRange(sel);
      if (FTB_Browser.isIE) {
         range.pasteHTML(image.outerHTML);
         } else {
            this.InsertNodeAtSelection(image);
         }
      }
   }
   

这样,制作按钮的工作基本可以结束了,接下来,看如何把我们自己制作的按钮添加到工具栏上。
我试了readme.txt中讲解的三种方法,其中前两种都无效,只有最后一种,也就是在后台代码里添
加是可行的,我想可能是程序在FreeTextBox.dll程序集中找不到我自己的按钮类吧,因为我的按钮
类无法编译到其程序集中。还好有第三种方法不会让我们失望,具体的方法可以参考如下代码(
其实很简单,只不过让阅读的朋友不用回头查看readme文本啦):

public static void AddToolBarButton(FreeTextBoxControls.FreeTextBox myFtb)
{
   Toolbar bar = null;
   bar = new Toolbar();
   bar.Items.Add(new ParagraphMenu());
   bar.Items.Add(new FontFacesMenu());
   bar.Items.Add(new FontSizesMenu());
   bar.Items.Add(new FontForeColorsMenu());
   bar.Items.Add(new FontForeColorPicker());
   bar.Items.Add(new FontBackColorsMenu());
   bar.Items.Add(new FontBackColorPicker());
   myFtb.Toolbars.Add(bar);
   
   bar = new Toolbar();
   bar.Items.Add(new Bold());
   bar.Items.Add(new Italic());
   bar.Items.Add(new Underline());
   bar.Items.Add(new StrikeThrough());
   bar.Items.Add(new SuperScript());
   bar.Items.Add(new SubScript());
   bar.Items.Add(new RemoveFormat());
   myFtb.Toolbars.Add(bar);
   
   bar = new Toolbar();
   bar.Items.Add(new InsertImageFromGallery());
   bar.Items.Add(new InsertQQ());
   myFtb.Toolbars.Add(bar);
}

 

到此,你就可以使用你自己的按钮啦,但我要说明以下三点:

1)  要把FreeTextBox读取资源的方式改为外在资源,这很重要。
2)   在使用后台代码创建按钮的时候,注意把FreeTextBox的属性AutoGenerationToolBarsFromString
   设为false
3)   自己按钮的图片的位置会根据你选择的按钮的样式而不同,即aspnet_client\FreeTextBox
      下面的images,office2000等等,所以你要在这几个目录下面添加你自己的按钮的图片。

到这里你就可以享受你自己的按钮带来的愉悦吧!除此之外就让我们感谢FreeTextBox的作者
吧,是他们让我们可以免费使用此控件以及可以很容易的可扩展控件的功能,还有那些对我们非
常有用的文档。


转自:http://www.cnblogs.com本文来源:
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:C# 使用设计模式构建通用数据库访问类
下一篇:C#基础之索引器(Indexer)
评论列表

发表评论

评论内容
昵称:
关联文章

[]FreeTextBox添加定义按钮
[]ACTIVE OBJECT 模式
DevExpress GridControl组件的EmbeddedNavigator属性添加用户定义按钮
[]C# const和static readonly有什么区别?
WinFramework轻量级开发框架 - 界面扩展按钮-定义按钮
[]C#如何调用非托管函数(一)
窗体的定义按钮权限控制-扩展权限按钮详解
如何扩展窗体的定义权限按钮
如何删除Toolbar的定义按钮? 如审核|反审|根据按钮名称删除
[]C#如何调用非托管函数(三)-实现回调函数
FreeTextBox HTML即时输入组件太好太强大!
解决方案:扩展按钮定义权限没有出现在权限树给用户勾选
[]C#如何调用非托管函数(二)-传递结构和类
WinFramework轻量级开发框架 - 窗体定义功能按钮(InitButton/AddButton方法)
Winform开发框架 - 特殊权限控制(扩展权限和定义按钮功能)
C# 控件的属性是个类,如何给添加定义属性
控件的属性是个类,如何给添加定义属性(C#)
如何进行菜单管理、扩展权限、更改定义按钮名称|C/S框架网
模块主窗体怎样控制定义按钮的权限
GridView实现定义按钮及中间插入记录排序功能

热门标签
.NET5 .NET6 .NET7 APP Auth-软件授权注册系统 Axios B/S B/S开发框架 Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 DAL数据访问层 Database datalock DbFramework Demo教学 Demo下载 DevExpress教程 DOM EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS NavBarControl Node.JS NPM OMS ORM PaaS POS Promise API Redis SAP SEO SQL SQLConnector TMS系统 Token令牌 VS2022 VSCode VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 版本区别 报表 踩坑日记 操作手册 代码生成器 迭代开发记录 基础资料窗体 架构设计 角色权限 开发sce 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 秘钥 密钥 权限设计 软件报价 软件测试报告 软件简介 软件开发框架 软件开发平台 软件开发文档 软件体系架构 软件下载 软著证书 三层架构 设计模式 生成代码 实用小技巧 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序