2016-09-17 16 views
0

В следующем коде: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

вы действуете является «OnLeftUp()», но вы говорите о правой кнопке мыши. Который из них? – Igor

+0

Я не говорю о правой кнопке, извините за непонимание. – macroland

+0

Вы пробовали образец stc? Попытайтесь включить решение эхуморо, если простой образец не работает должным образом. – Igor

ответ

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

Я согласен с тобой. Было также мое наблюдение, что, как я пытался, был либо выбор из текущей позиции в начало слова, либо до конца слова. Я на самом деле пытался выделить слова (думая, что это будет выбор); однако я понял, что это не совсем хорошая идея, и, кроме того, она достигла того, что с использованием индикаторов, которые работают как шарм. – macroland

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

Я тоже пробовал, но это тоже не сработало. – macroland

+0

@macroland. Я не могу проверить использование wxStyledTextCtrl, но эквивалентные команды работают точно так, как ожидалось в QScintilla (как и 'SetSelection'). Таким образом, проблема заключается либо в какой-либо другой части вашего кода, либо в wxStyledTextCtrl есть ошибка. (PS: проверено с использованием QScintilla-2.9.3 + Scintilla-3.5.4). – ekhumoro

+0

Мое предположение - это нечто, что связано с 'InsertionPoint'. Выбор происходит от точки, где каретка соответствует началу слова. Я попытался переместить каретку до конца слова, не мог этого достичь. Кстати, вы попробовали это для события OnLeftUp? – macroland