private void HighlightWord(Scintilla scintilla, string text)
{
if (string.IsNullOrEmpty(text))
return;
// Indicators 0-7 could be in use by a lexer
// so we'll use indicator 8 to highlight words.
const int NUM = 8;
// Remove all uses of our indicator
scintilla.IndicatorCurrent = NUM;
scintilla.IndicatorClearRange(0, scintilla.TextLength);
// Update indicator appearance
scintilla.Indicators[NUM].Style = IndicatorStyle.StraightBox;
scintilla.Indicators[NUM].Under = true;
scintilla.Indicators[NUM].ForeColor = Color.Green;
scintilla.Indicators[NUM].OutlineAlpha = 50;
scintilla.Indicators[NUM].Alpha = 30;
// Search the document
scintilla.TargetStart = 0;
scintilla.TargetEnd = scintilla.TextLength;
scintilla.SearchFlags = SearchFlags.None;
while (scintilla.SearchInTarget(text) != -1)
{
// Mark the search results with the current indicator
scintilla.IndicatorFillRange(scintilla.TargetStart, scintilla.TargetEnd - scintilla.TargetStart);
// Search the remainder of the document
scintilla.TargetStart = scintilla.TargetEnd;
scintilla.TargetEnd = scintilla.TextLength;
}
}
调用很简单,在本例中,以@开头的单词将突出显示:
Regex regex = new Regex(@"@\w+");
string[] operands = regex.Split(txtScriptText.Text);
Match match = regex.Match(txtScriptText.Text);
if (match.Value.Length > 0)
HighlightWord(txtScriptText, match.Value);
4条答案
按热度按时间brqmpdu11#
你读过Scintilla文档中的Markers参考吗?这个参考可能有点晦涩,所以我建议你也看看SciTE的源代码。这个文本编辑器最初是Scintilla的一个测试平台。它成长为一个成熟的编辑器,但它仍然是Scintilla所有东西的一个很好的实现参考。
在我们的特殊情况下,在Find对话框中有一个Mark All按钮。你可以在SciTEBase::MarkAll()方法中找到它的实现。这个方法只在搜索结果上循环(直到它在第一个搜索结果上循环,如果有的话),并在找到的行上放置一个书签(并可选地在找到的项目上设置一个指示符)。找到的行是使用SCI_LINEFROMPOSITION(posFound)获得的,书签只是对SCI_MARKERADD(lineno,markerBookmark)的一个调用。注意,标记可以是页边空白中的符号,或者如果没有关联到页边空白,它将突出显示整行。
嗯。
2skhul332#
“sample”编辑器站点使用书签特性为所有与搜索结果匹配的行添加书签。
46qrfjad3#
我使用指标来突出显示搜索结果。
qyswt5oh4#
此解决方案在C#中有效:
调用很简单,在本例中,以@开头的单词将突出显示: