使用 .setsel(起始位置,结束位置) 设置选区后着色
//论坛交流-RichEdit着色(语法高亮)
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="文本高亮";left=654;top=7;right=752;bottom=58;z=1};
richedit={cls="richedit";text='a=1\r\nb=2\r\naa=12\r\nbb=a+b+aa\r\nbab=aabbab(a,b,aa,bb)';left=7;top=8;right=646;bottom=461;edge=1;multiline=1;z=2}
)
/*}}*/
//定义正则匹配表达式与对应RTF格式二维表
var table = {
{ 'a',{ textColor = 0x0000FF; } };
{ 'b',{ textColor = 0x0000FF; } };
{ 'aa',{ textColor = 0x0000FF; } };
{ 'bb',{ textColor = 0x0000FF; } };
{ 'bab',{ textColor = 0x0000FF; } };
};
//使用这种方式可以更改每个表达式对应的文字颜色和背景,取消注释后试一下吧
/*
var table = {
{ 'a',{ backColor = 0xFFFFFF; textColor = 0x0000FF; } };
{ 'b',{ backColor = 0xFFFFFF; textColor = 0x2862BB; } };
{ 'aa',{ backColor = 0xFFFFFF; textColor = 0x6A9955; } };
{ 'bb',{ backColor = 0xFFFFFF; textColor = 0xCE6E3F; } };
{ 'bab',{ backColor = 0xCFCFFF; textColor = 0x0000FF; } };
{ '\\)',{ backColor = 0xFFFFFF; textColor = 0x0000FF; } };
// ↑因重置了新增字符的默认样式,即使最后一个字符是特殊样式的,也不会影响新增字符
};
*/
import string.regex;//VBS正则表达式支持库
winform.button.oncommand = function(){
var owner = winform.richedit;//这样写代码清晰一点
owner.text = owner.text;//清除控件中的RTF格式为纯文本
var str = string.crlf( owner.text,' ' );
for( i=1;#table;1 ){
//创建表达式对象
var regexObj = string.regex( table[i][1] );
for k,smatch in regexObj.gmatch( str ){
//将字符串中匹配到的字符选中后着色
owner.setsel( smatch.FirstIndex + 1, smatch.FirstIndex + string.len( smatch.Value ) );
owner.setSelCharformat( table[i][2] );
}
}
//重置新增字符的默认样式
owner.setsel(-1);//无选区,移动光标到指定位置的字符后面
owner.setSelCharformat( { backColor = 0xFFFFFF; textColor = 0x000003; } );//或者 ↓这样写
//owner.setCharformat( { backColor = 0xFFFFFF; textColor = 0x000003; },1/*_SCF_SELECTION 选区的*/ );
}
winform.show();
win.loopMessage();
另外你若想在 richedit 中完整实现代码高亮的效果,
应注意编辑写入时频繁操作带来的实时渲染卡顿问题,
以及RTF文档能粘贴图片等资源导致着色位置存在差异的问题,
以及调整格式后恢复光标位置的问题,
还有需控制存在大量内容响应时滚动条的变化...
不过很巧,这些问题之前我都解决过,可以参考此贴 https://www.aardio.cc/thread-106-1-1.html