wxWidgets / wxStyledTextCtrl - 双击时突出显示所有出现的情况
wxWidgets / wxStyledTextCtrl - Highlight all occurrences when doubleclicking
我在Windows 10上的静态Unicode构建中使用wxWidgets 3.0.2。我正在使用wxStyledTextCtrl,这是Scintilla的近1对1映射。
我正在寻找类似于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 对应项没有。我无法清楚地确定应该将其设置为什么。保留现有的 5 个样式/词法分析器位似乎是 31(00011111
(?从本质上讲,如果我想做的只是修改每次出现的背景颜色,我不确定该将其设置为什么。 - 我的程序将定期处理数十兆字节或更多大小的文件,所以我是否应该只突出显示可见的事件,并在滚动/跳跃时根据需要进行调整?目前,它会搜索并(未能(在每次出现时设置样式,并且在 50MB 文件上大约需要一秒钟。我观察到在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 秒才能完成。
相关文章:
- 如何在不将其转换为 ASCII 字符的情况下显示 QByteArray 的十六进制值
- 如果 return 语句在带括号的循环中,错误可能会到达非 void 函数的末尾,但不会显示在没有括号的循环的情况下
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- 如何在不显示媒体播放器的情况下在libVLC中拍摄快照
- 尝试创建一个读取.txt文件,显示它,计数唯一单词的程序,并在使用了多少次的情况下显示独特的单词.C
- 如何在不使用 C++ 函数的情况下显示链表中的元素
- 在不到一分钟的情况下,在一秒钟内显示计时器
- 在没有任何外部库的情况下,是否可以在c++/linux的窗口中显示bmp图像
- 在没有人工交互的情况下,在nginx上为每个cpp突出显示语法
- 如何在不显示文本的情况下分配Win32编辑控件的窗口名称
- 我的代码将不会显示为每种情况C 的代码
- 如何在不考虑会话的情况下获取显示设备信息
- QtC++编译是在没有显示程序的情况下完成的
- 如何在不显示十六进制的情况下读取dat文件中的文本?C++
- PDB无法显示发布版本崩溃的确切行号,但在二进制调试版本的情况下显示精确行号
- 如何在不舍入的情况下以C++显示固定位数
- 是否可以使用 opencv 的 imshow 在没有工具栏的情况下显示图像?
- wxWidgets / wxStyledTextCtrl - 双击时突出显示所有出现的情况
- 如何在Windows中不显示cmd窗口的情况下运行带参数的外部程序
- 如何在 c++ 中不将其显示为函数定义的情况下调用函数