wxWidgets / wxStyledTextCtrl - 双击

时间:2016-01-29 23:13:24

标签: c++ wxwidgets scintilla wxstyledtextctrl

我在Windows 10上使用静态unicode构建中使用wxWidgets 3.0.2。我使用的是wxStyledTextCtrl,它是Scintilla的 near 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;
    }
}

循环的搜索部分成功找到所选文本;这只是造型似乎没有抓住。

所以我无法找到答案的问题是:

  1. styleHightlightAllSelectedint设置为100.当我将其设为0时,双击时整个文档变为绿色。我看到样式32-39是预定义的。是否有其他预定义但未真实记录的样式;意思是,100好吗?
  2. 我是否必须设置整个样式,或者我可以像上面一样设置背景颜色?
  3. 当我找到一个事件并完成它时,是否足够StartStyling()SetStyling(),还是有更多?
  4. wxWidgets中的
  5. StartStyling()有一个掩码参数,但Scintilla对应物没有。我无法清楚地确定我应该将其设置为什么。似乎是31(00011111)来保留5个现有的样式/词法分析器位?基本上,如果我想要做的就是修改每次出现的背景颜色,我不知道该怎么做。
  6. 我的程序会定期处理数十或更多兆字节的文件,所以我应该突出显示可见的事件,并在滚动/跳转时根据需要进行调整?目前它搜索并且(未能)在每次出现时设置样式,并且在50MB文件上花费大约一秒钟。我观察到在Notepad ++中加载的同一文件中,它会立即发生,所以我假设它是在可见的基础上进行的吗?

1 个答案:

答案 0 :(得分:0)

我最后在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秒才能完成突出显示。