wxStyledTextCtrl SetSelection

时间:2016-09-17 06:37:31

标签: c++ selection wxwidgets scintilla wxstyledtextctrl

在以下代码中:

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之间左键单击)时,标识符被正确识别为{{ 1}}。但是,只选择hello,而我希望选择整个单词he。怎么可能出错?如果位置错误,那么标识符的值应该是错误的,但情况并非如此。

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

2 个答案:

答案 0 :(得分:0)

根据SetSelection的文档:

  

请注意,插入点将通过此函数

从移动到

不完全确定原因,但这似乎影响了最终的选择。您可以尝试重写这样的函数:

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();
}

答案 1 :(得分:0)

你想要做的事情是不可能的。在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);
}