0

次のコードでは:

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が選択されると予想されます。何がうまくいかないのですか?位置が間違っていれば、識別子の値も間違っているはずですが、そうではありません。

ちなみにWindows10でwxWidgets 3.1を使っています。

4

2 に答える 2

0

あなたがやりたいことは、正確には不可能です。scintilla/wxStyledTextCtrl では、選択は常にどこかから現在のキャレット位置まで実行されます。現在の位置の前から始まり、その後で終わる選択をしようとしていますが、それはできません。

また、これは基本的に単語をダブルクリックしたときのデフォルトの動作ですが、ダブルクリックするとキャレットが単語の末尾に移動します。ワンクリックでこれを行う必要がありますか? ただし、本当に必要な場合は、複数の選択を使用してこの外観を与えることができます。基本的に、単語の先頭から現在の位置までの 1 つの選択と、現在の位置から最後までの 2 つ目の選択があります。

これらのコマンドをマウス ハンドラーの前に呼び出される場所 (おそらくコンストラクター内) に配置し、このプロトタイプ "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);
}
于 2016-09-19T00:23:32.740 に答える
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();
}
于 2016-09-17T15:51:34.080 に答える