2011-07-15 29 views
2

私はいくつかの特定の単語に1行のwx.textctrlで下線を引いています。私は、GetTextExtentを使ってコントロール内の単語の位置を計算し、wx.ClintDCを使って線を描くことによってそれをやっています。実際にwx.TextCtrlに表示される文字を取得するには?

私の問題は、TextCtrlのテキストがコントロールのサイズより長い場合に発生します。たとえば、ユーザーが〜100文字を入力した場合、コントロールの長さが十分でない場合は20文字しか表示されません。

私の質問は、実際には1行のコントロールに表示される文字列を取得する方法は?または(左側の)表示されないテキストの幅をピクセル単位で計算する方法はありますか?

1行のテキストコントロールにはスクロールバーがありません。 GetInsertionPointは、テキスト内のキャレットの位置を返しますが、コントロールの左端から実際のピクセル単位の距離に変換することは不可能です。

右から左のテキストをサポートしていないため、StyledTextCtrlクラスではなく、TE_RICHまたはTE_RICH2スタイルを使用したくありません。

答えて

0

[OK]を、私が見つけた解決策は以下のとおりです。

from win32api import SendMessage 
result = SendMessage(self.GetHandle(), EM_POSFROMCHAR, 0, 0) 

結果は、コントロールの最初の文字のクライアント座標です。指定した文字が編集コントロールのクライアント領域に表示されていない場合は、値は負の値になります。

0

私はあなたがwx.TextCtrlのテキストに下線を引くためにTE_RICHスタイルの1つを使用しなければならないと思います。 StyledTextコントロールを試しましたか?彼らはより多くのコントロールを与えるかもしれないシンチラを使用します。

また、ExpandoTextCtrlもあります。これは、ユーザータイプとして展開されます。あなたはロケールを設定した場合

また、あなたは自動的に右から左への動作を取得する必要があります:http://wiki.wxpython.org/Internationalization#Switching_between_Left_to_Right_and_Right_to_Left_Languages

を私は実際には表示されている文字列の一部をつかむための方法が表示されません。フォントの幅を使用して、おそらくテキストコントロールの選択メソッドを使用して計算する必要があります。 wxPythonメーリングリストにもクロスポストしたいかもしれません。彼らはおそらく考えも持っているだろう。

+0

ありがとうございますが、私が書いたように、TE_RICH、TE_RICH2およびStyledTextCtrlクラスはRTLテキストAFAIKをサポートしていません。 Ans私は自分のアプリケーションのレイアウトを変更するのではなく、いくつかのコントロールでRTLテキストを入力できるようにするだけです。 –

+0

リッチコントロールまたはStyledTextCtrlでSetLayoutDirection()を試してみましたか?プログラムを変更する必要はありません。確認するためにワン・オフを書いてください。 –

+0

Scintillaは現在、LTRテキストとインジケータ(特にRTLとLTRを組み合わせた場合)のRTLテキスト表示に問題があります。 –

関連する問題