ScintillaNET的应用
出于工作需要,需要制作一个嵌入在桌面应用中的C语言编辑器,经过一系列调研,目前ScintillaNET应该是最合适的了,开源、轻便、功能丰富,但是踩得坑也很多,接下面一一说道。
目前ScintillaNET托管在https://github.com/jacobslusser/ScintillaNET,拉下来重新编译。由于需要移植到.NET 2.0的平台上,需要修改源码中的对Linq的依赖,这里不多说,把目标框架改为.NET 2.0,编译,哪里报错改哪里。
1. 编辑器风格
参考:https://github.com/robinrodricks/ScintillaNET.Demo

2. 括号的匹配和高亮
为了方便多处调用该控件,继承Scintilla类,实现“自定义”控件,以下均以这种做法来实现功能。
重写OnUpdateUI事件,在UpdateUI中实现括号匹配功能。
private int m_lastCaretPos =;
protected override void OnUpdateUI(UpdateUIEventArgs e)
{
base.OnUpdateUI(e);
MatchAndLightBracket();
}
private void MatchAndLightBracket()
{
// Has the caret changed position?
int caretPos = this.CurrentPosition;
if (m_lastCaretPos != caretPos)
{
m_lastCaretPos = caretPos;
int bracePos1 = -;
int bracePos2 = -; // Is there a brace to the left or right?
if (caretPos > && IsBrace(this.GetCharAt(caretPos - )))
bracePos1 = (caretPos - );
else if (IsBrace(this.GetCharAt(caretPos)))
bracePos1 = caretPos; if (bracePos1 >= )
{
// Find the matching brace
bracePos2 = this.BraceMatch(bracePos1);
if (bracePos2 == CodeEditor.InvalidPosition)
{
ReleaseHighlightB();
}
else
{
ReleaseHighlightB();
HighlightBracket(bracePos1);
HighlightBracket(bracePos2);
}
}
else
{
ReleaseHighlightB();
}
}
}
private void HighlightBracket(int pos)
{
if (pos < )
return;
this.IndicatorFillRange(pos, );
}
private void ReleaseHighlightB()
{
this.IndicatorClearRange(, this.TextLength);
}
private static bool IsBrace(int c)
{
switch (c)
{
case '(':
case ')':
case '[':
case ']':
case '{':
case '}':
case '<':
case '>':
return true;
} return false;
}
3. Ctrl+Z会一次性清空所有的修改
protected override void OnBeforeInsert(BeforeModificationEventArgs e)
{
base.OnBeforeInsert(e);
Count = this.Text.Length;
this.BeginUndoAction();
}
protected override void OnInsert(ModificationEventArgs e)
{
base.OnInsert(e);
if (Count < this.Text.Length)
this.EndUndoAction();
}
4.缩进调整
protected override void OnCharAdded(CharAddedEventArgs e)
{
base.OnCharAdded(e);
AutoIndicator();
}
private void AutoIndicator()
{
int pos = this.CurrentPosition;
if (pos > && this.GetCharAt(pos - ) == '\n' && this.GetCharAt(pos - ) == '\r')
{
if (this.GetCharAt(pos - ) == '{')
{
string[] Text = GetStringList();
string line = Text[this.CurrentLine - ];
int start = line.IndexOf(line.TrimStart());
string ss = line.Substring(, start);
string str = new string(' ',);
this.InsertText(pos, ss+str);
this.SelectionStart = this.SelectionEnd = pos + ss.Length + ;
}
else
{
string[] Text = GetStringList();
string line = Text[this.CurrentLine - ];
int start = line.IndexOf(line.TrimStart());
string ss = line.Substring(, start);
this.InsertText(pos, ss);
this.SelectionStart = this.SelectionEnd = pos + ss.Length;
} }
}
private string[] GetStringList()
{
string[] s = new string[] { "\n" };
return this.Text.Split(s, StringSplitOptions.None);
}
目前整理了这么多,有机会再继续深入理解和应用ScintillaNET。
ScintillaNET的应用的更多相关文章
- WinForm搭载ScintillaNET时文本由于发生偏移被隐藏解决方案
项目用ScintillaNet搭载到WinForm以满足文本编辑的需求,在用FindReplace.Scintilla.Text=“显示内容”输出文本内容的时候会碰到文本被WinForm边框隐藏的情况 ...
- DotNet 资源大全中文版(Awesome最新版)
Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. 算法与数据结构 ...
- C#开源
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C# 开源项目一
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C#开源大全--汇总(转)
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C#开源大全--汇总
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C#源码大汇总
C#高仿QQ2013可在广域网部署聊天系统GG叽叽 动态显示硬盘分区容量饼图 自定义ProgressBar控件高仿Win8进度条 多皮肤精美在线QQ悬浮客服插件 jQuery仿天猫首页多格焦点图片轮播 ...
- C#开源汇总
原文:C#开源汇总 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Pho ...
- C# 网上收集的一些所谓的开源项目
C#开源 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7- ...
随机推荐
- 字符串匹配 - sunday算法
常见的字符串匹配算法有BF.KMP(教科书中非常经典的).BM.Sunday算法 这里主要想介绍下性能比较好并且实现比较简单的Sunday算法 . 基本原理: 从前往后匹配,如果遇到不匹配情况判断母串 ...
- python+selenium—webdriver入门(一)
一.浏览器最大化 二.设置浏览器分辨率大小 三.打印页面title 四.打印URL 五.控制浏览器前进或后退 #!/usr/bin/env python#-*- coding:utf-8 -*- fr ...
- Silverlight保存大数据到WCF出现Not Found问题
Silveright调用WCF保存大数据时,直接在客户端报“ 远程服务器返回了错误:Not Found ”问题,少量是没问题,如下图: 后面在这个文章中找到解决办法: http://www.cnblo ...
- @Valid报错 No validator could be found for constraint
使用hibernate validator出现上面的错误, 需要 注意 @NotNull 和 @NotEmpty 和@NotBlank 区别 @NotEmpty 用在集合类上面@NotBlank 用 ...
- word表格如何实现序号自动填充
打开word文档,我们需要在如下表格中的准考证号这一列中输入准考证号,手工输入肯定很慢,且容易出错. 我们先选中需要填充准考证号的表格. 选择功能区域中的“开始”,在“段落”组中点击“编号”按 ...
- 728. Self Dividing Numbers
class Solution { public: vector<int> selfDividingNumbers(int left, int right) { vector<int& ...
- SQL错误
一.mybatis框架XML错误 1.ORA-00918: 未明确定义列:SQL语句中列明重复,或者定义不明确(关联查询时两张表都有要区分开列明) 2.无效的列类型: 1111 :a.传入数据漏传一 ...
- mac os下提高android studio运行速度终极方法
/Users/hangliao/ 删除(.android .gradle)两个文件夹 android studio恢复所有设置到初始化状态,这样会删除已创建的模拟器,所以需从创建一下模拟器 mac ...
- Le Chapitre X
Il se trouvait dans la région des astéroïdes 325, 326, 327, 328, 329 et 330. Il commença donc par le ...
- CLE的使用笔记
CLE官网http://www.srplab.com/cn/index.html 下载CLE for Android,解压文件,拷贝 starcore_android_rX.X.jar到工程的libs ...