wxWidgets / wxStyledTextCtrl - 双击时突出显示所有事件
wxWidgets / wxStyledTextCtrl - Highlight all occurrences when doubleclicking
我在 Windows 10 上的静态 unicode 构建中使用 wxWidgets 3.0.2。我正在使用 wxStyledTextCtrl,它是 near 一对一Scintilla 的映射。
我正在寻找类似于 Notepad++ 的功能,在该功能中双击编辑器中的某项后,该项目的所有匹配项都会突出显示。很难找到真正展示样式的好例子。我查看了 wxWidgets 文档、Scintilla 文档、Notepad++ 源代码和 Code::Blocks 源代码(后两者使用 Scintilla 作为它们的文本编辑器),但仍然运气不佳。
我尝试了以下代码的许多不同变体,但始终无法正常工作。要么没有突出显示,要么突出显示整个文档。我知道我错过了什么,但我不知道是什么。
//textarea is a wxStyledTextCtrl*
textarea->StyleSetBackground(styleHightlightAllSelected, wxColor(80, 255, 80));
wxString selectedText = textarea->GetSelectedText();
int selSize = selectedText.size();
int selStart = textarea->GetSelectionStart();
int pos = 0;
int curr = 0;
int maxPos = textarea->GetLastPosition();
while(pos != -1){
pos = textarea->FindText(curr, maxPos, selectedText);
if(pos == selStart){ //skip the actual highlighted item
curr = pos + selSize;
} else if(pos != -1){
textarea->StartStyling(pos, 0x1F);
textarea->SetStyling(selSize, styleHightlightAllSelected);
curr = pos + selSize;
}
}
循环的搜索部分确实成功找到了所选文本;只是造型似乎并没有站稳脚跟。
所以我无法真正找到答案的问题是:
styleHightlightAllSelected
是一个设置为 100 的 int
。当我将它设置为 0 时,双击时整个文档变成绿色。我看到样式 32-39 是预定义的。是否有其他预定义但未真正记录的样式?意思是,100可以吗?
- 我是否必须设置整个样式,或者我可以像上面那样设置背景颜色吗?
- 当我发现并解决它时,做
StartStyling()
和 SetStyling()
就够了吗,还是还有更多?
wxWidgets 中的 StartStyling()
有一个掩码参数,但 Scintilla 对应物没有。我无法清楚地确定我应该将其设置为什么。好像是31(00011111
)来保留现有的5个styling/lexer位?本质上,如果我只想修改每次出现的背景颜色,我不确定将其设置为什么。
- 我的程序会定期处理几十兆或更多兆字节的文件,所以我是否应该只突出显示可见的事件,并在 srolling/jumping 时根据需要进行调整?目前,它会在每次出现时搜索并(未能)设置样式,并且在 50MB 的文件上大约需要一秒钟。我观察到在 Notepad++ 中加载的同一个文件上,它会立即发生,所以我假设它是在可见的基础上发生的?
我最后在 Notepad++ 项目的 github 问题页面上询问了这个问题,正确的方法是不使用样式,而是使用指示符。所以我上面的代码更改为:
int maxPos = textarea->GetLastPosition();
textarea->IndicatorClearRange(0, maxPos);
textarea->IndicatorSetStyle(styleHightlightAllSelected, wxSTC_INDIC_ROUNDBOX);
textarea->IndicatorSetAlpha(styleHightlightAllSelected, 100);
textarea->IndicatorSetUnder(styleHightlightAllSelected, true);
textarea->IndicatorSetForeground(styleHightlightAllSelected, wxColor(0, 255, 0));
wxString selectedText = textarea->GetSelectedText();
int selSize = selectedText.size();
int selStart = textarea->GetSelectionStart();
int pos = 0;
int curr = 0;
vector<int> selectionList;
while((pos = textarea->FindText(curr, maxPos, selectedText)) != -1){
selectionList.push_back(pos);
curr = pos + selSize;
}
textarea->SetIndicatorCurrent(styleHightlightAllSelected);
for(unsigned int i = 0; i < selectionList.size(); i++){
if(selectionList[i] != selStart){
textarea->IndicatorFillRange(selectionList[i], selSize);
}
}
然而,这并没有考虑,只突出显示可见范围,并且只突出显示新出现的内容,因为它们滚动到视图中(我将在稍后添加),因此对于大小为几十兆字节的文件,它将突出显示需要 2-3 秒才能完成。
我在 Windows 10 上的静态 unicode 构建中使用 wxWidgets 3.0.2。我正在使用 wxStyledTextCtrl,它是 near 一对一Scintilla 的映射。
我正在寻找类似于 Notepad++ 的功能,在该功能中双击编辑器中的某项后,该项目的所有匹配项都会突出显示。很难找到真正展示样式的好例子。我查看了 wxWidgets 文档、Scintilla 文档、Notepad++ 源代码和 Code::Blocks 源代码(后两者使用 Scintilla 作为它们的文本编辑器),但仍然运气不佳。
我尝试了以下代码的许多不同变体,但始终无法正常工作。要么没有突出显示,要么突出显示整个文档。我知道我错过了什么,但我不知道是什么。
//textarea is a wxStyledTextCtrl*
textarea->StyleSetBackground(styleHightlightAllSelected, wxColor(80, 255, 80));
wxString selectedText = textarea->GetSelectedText();
int selSize = selectedText.size();
int selStart = textarea->GetSelectionStart();
int pos = 0;
int curr = 0;
int maxPos = textarea->GetLastPosition();
while(pos != -1){
pos = textarea->FindText(curr, maxPos, selectedText);
if(pos == selStart){ //skip the actual highlighted item
curr = pos + selSize;
} else if(pos != -1){
textarea->StartStyling(pos, 0x1F);
textarea->SetStyling(selSize, styleHightlightAllSelected);
curr = pos + selSize;
}
}
循环的搜索部分确实成功找到了所选文本;只是造型似乎并没有站稳脚跟。
所以我无法真正找到答案的问题是:
styleHightlightAllSelected
是一个设置为 100 的int
。当我将它设置为 0 时,双击时整个文档变成绿色。我看到样式 32-39 是预定义的。是否有其他预定义但未真正记录的样式?意思是,100可以吗?- 我是否必须设置整个样式,或者我可以像上面那样设置背景颜色吗?
- 当我发现并解决它时,做
StartStyling()
和SetStyling()
就够了吗,还是还有更多?
wxWidgets 中的 StartStyling()
有一个掩码参数,但 Scintilla 对应物没有。我无法清楚地确定我应该将其设置为什么。好像是31(00011111
)来保留现有的5个styling/lexer位?本质上,如果我只想修改每次出现的背景颜色,我不确定将其设置为什么。- 我的程序会定期处理几十兆或更多兆字节的文件,所以我是否应该只突出显示可见的事件,并在 srolling/jumping 时根据需要进行调整?目前,它会在每次出现时搜索并(未能)设置样式,并且在 50MB 的文件上大约需要一秒钟。我观察到在 Notepad++ 中加载的同一个文件上,它会立即发生,所以我假设它是在可见的基础上发生的?
我最后在 Notepad++ 项目的 github 问题页面上询问了这个问题,正确的方法是不使用样式,而是使用指示符。所以我上面的代码更改为:
int maxPos = textarea->GetLastPosition();
textarea->IndicatorClearRange(0, maxPos);
textarea->IndicatorSetStyle(styleHightlightAllSelected, wxSTC_INDIC_ROUNDBOX);
textarea->IndicatorSetAlpha(styleHightlightAllSelected, 100);
textarea->IndicatorSetUnder(styleHightlightAllSelected, true);
textarea->IndicatorSetForeground(styleHightlightAllSelected, wxColor(0, 255, 0));
wxString selectedText = textarea->GetSelectedText();
int selSize = selectedText.size();
int selStart = textarea->GetSelectionStart();
int pos = 0;
int curr = 0;
vector<int> selectionList;
while((pos = textarea->FindText(curr, maxPos, selectedText)) != -1){
selectionList.push_back(pos);
curr = pos + selSize;
}
textarea->SetIndicatorCurrent(styleHightlightAllSelected);
for(unsigned int i = 0; i < selectionList.size(); i++){
if(selectionList[i] != selStart){
textarea->IndicatorFillRange(selectionList[i], selSize);
}
}
然而,这并没有考虑,只突出显示可见范围,并且只突出显示新出现的内容,因为它们滚动到视图中(我将在稍后添加),因此对于大小为几十兆字节的文件,它将突出显示需要 2-3 秒才能完成。