wxStyledTextCtrl SetSelection

В следующем коде:

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и я оставил щелчок между e а также l) идентификатор правильно обозначен как hello, Однако только he выбран, тогда как я ожидал бы целое слово hello быть выбранным. Что может быть не так? Если позиции были неправильными, то значение идентификатора должно было быть неправильным, а это не так.

Кстати, я использую wxWidgets 3.1 на Windows 10.

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

По вопросам рекламы [email protected]