【问题标题】:wxStyledTextCtrl SetSelectionwxStyledTextCtrl 设置选择
【发布时间】:2017-01-25 09:35:51
【问题描述】:

在以下代码中:

void Script::OnLeftUp( wxMouseEvent& event )
{
    int currentPos = GetCurrentPos();
    int wordStartPos = WordStartPosition( currentPos, true );
    int wordEndPos=WordEndPosition(wordStartPos, true);
    wxString identifier=GetRange(wordStartPos,wordEndPos);
    SetSelection(wordStartPos, wordEndPos );
    event.Skip();
}

当我单击单词中的某个点时(例如,单词是hello,我在el 之间左键单击),标识符被正确识别为hello。但是,只选择了he,而我希望选择整个单词hello。可能出了什么问题?如果位置错误,那么标识符的值应该是错误的,事实并非如此。

顺便说一句,我在 Windows 10 上使用 wxWidgets 3.1。

【问题讨论】:

  • 你的函数是“OnLeftUp()”,但你说的是鼠标右键。是哪一个?
  • 我说的不是右键,误会见谅。
  • 你试过stc样品了吗?如果普通样本没有按预期执行,请尝试使用 ekhumoro 的解决方案。

标签: c++ selection wxwidgets scintilla wxstyledtextctrl


【解决方案1】:

您想要做的事情并不完全可能。在 scintilla/wxStyledTextCtrl 中,选择总是从某处运行到当前插入符号位置。您正在尝试在当前位置之前开始并在其之后结束的选择,这是无法完成的。

这基本上也是双击单词时的默认行为,但双击会将插入符号移到单词末尾。您真的需要单击一下来执行此操作吗?如果你真的想要,你可以使用多个选择来给出它的外观。基本上,您将有一个从单词开头到当前位置的选择,以及从当前位置到结尾的第二个选择。

将这些命令放在鼠标处理程序之前被调用的位置(可能在构造函数中),并使用此原型“void SelectCurWord();”声明一个方法

SetSelBackground(true, wxColour(192,192,192) );
SetSelForeground(true, wxColour(0,0,0) );

SetAdditionalSelBackground( wxColor(192,192,192) );
SetAdditionalSelForeground( wxColour(0,0,0) );
SetAdditionalCaretsVisible(false);

您可以将颜色更改为您想要的任何颜色,但请确保主要选择和附加选择使用相同的颜色。鼠标处理程序应该做这样的事情。

void Script::OnLeftUp( wxMouseEvent& event )
{
    CallAfter(&Script::SelectCurWord);
    event.Skip();
}

我们必须使用 CallAfter 的原因是让事件处理在尝试添加选择之前完成其工作。 SelectCurWord 方法基本上是您以前的方法,但改为使用多个选择:

void Script::SelectCurWord()
{
    int currentPos = GetCurrentPos();
    int wordStartPos = WordStartPosition( currentPos, true );
    int wordEndPos=WordEndPosition(wordStartPos, true);

    AddSelection(wordStartPos,currentPos);
    AddSelection(currentPos,wordEndPos);
}

【讨论】:

  • 我同意你的看法。这也是我的观察,我尝试的方式是从当前位置选择到单词的开头或到单词的结尾。我实际上是在尝试突出显示这些单词(认为这将是一个选择);然而,我意识到这根本不是一个好主意,而且我已经实现了使用像魅力一样的指标。
【解决方案2】:

根据SetSelection 的文档:

注意插入点会被这个函数移动到from

不完全确定为什么,但这似乎以某种方式影响了最终选择。您可以尝试像这样重写函数:

void Script::OnLeftUp( wxMouseEvent& event )
{
    int currentPos = GetCurrentPos();
    int wordStartPos = WordStartPosition( currentPos, true );
    int wordEndPos = WordEndPosition( currentPos, true );
    wxString identifier = GetRange( wordStartPos, wordEndPos );
    SetSelectionStart( wordStartPos );
    SetSelectionEnd( wordEndPos );
    event.Skip();
}

【讨论】:

  • 这个方法我也试过了,还是不行。
  • @macroland。我无法使用 wxStyledTextCtrl 进行测试,但等效命令在 QScintilla 中的工作方式完全符合预期(SetSelection 也是如此)。所以问题出在代码的其他部分,或者 wxStyledTextCtrl 中存在错误。 (PS:使用 QScintilla-2.9.3 + Scintilla-3.5.4 测试)。
  • 我的假设与InsertionPoint 有关。选择从插入符号所在的点到单词的开头发生。我试图将插入符号移到单词的末尾,但无法做到这一点。顺便问一下,您是否为OnLeftUp 活动尝试过?
  • @macroland。问题可能是鼠标事件的正常处理被打乱了。我认为您需要先处理鼠标事件(以便正确更新底层 Scintilla 控件),然后再进行新的选择。
  • 我试过把event.Skip()移到第一行;那也无济于事。选择从闪烁的光标到单词的开头。如果我找到一种方法将光标移动到单词的末尾,那么它将选择整个单词。我尝试了SetInsertionPointSetCurrentPos,但也没有用。
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2012-04-23
  • 2012-10-31
  • 2016-09-07
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多