【问题标题】:How to get chars that are actually displayed in wx.TextCtrl?如何获取实际显示在 wx.TextCtrl 中的字符?
【发布时间】:2011-10-06 03:37:30
【问题描述】:

我试图在单行 wx.textctrl 中强调一些特定的单词。我通过使用 GetTextExtent 计算控件中单词的位置并使用 wx.ClintDC 绘制线条来做到这一点。

当 TextCtrl 中的文本比控件的大小长时,我的问题就开始了,例如,如果用户输入 ~100 个字符,如果控件不够长,他只能看到最后 20 个字符。

我的问题是:如何获得实际显示在单行控件中的字符串?或者如何计算未显示(在左侧)的文本的宽度(以像素为单位)?

单行文本控件没有滚动条。 GetInsertionPoint 返回文本中插入符号的位置,但无法将其转换为距控件左边框的实际距离(以像素为单位)。

我不想使用 TE_RICH 或 TE_RICH2 样式而不是 StyledTextCtrl 类,因为它们不支持从右到左的文本。

【问题讨论】:

    标签: wxpython wxtextctrl


    【解决方案1】:

    好的,我找到的解决方案是:

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

    result 是控件中第一个字符的客户端坐标。如果指定的字符没有显示在编辑控件的客户区,则该值为负数。

    【讨论】:

      【解决方案2】:

      我认为您必须使用一种 TE_RICH 样式来为 wx.TextCtrl 中的文本添加下划线。您是否尝试过 StyledText 控件?他们使用 scintilla 可能会给你更多的控制。

      还有 ExpandoTextCtrl,它会随着用户键入而展开。

      此外,如果您设置了语言环境,您应该会自动获得从右到左的行为:http://wiki.wxpython.org/Internationalization#Switching_between_Left_to_Right_and_Right_to_Left_Languages

      我真的没有看到一种方法来抓取可见的字符串部分。您必须使用字体的宽度并可能使用文本控件的选择方法来计算它。您可能还想交叉发布到 wxPython 邮件列表。他们可能也会有想法。

      【讨论】:

      • 谢谢,但正如我所写,TE_RICH、TE_RICH2 和 StyledTextCtrl 类不支持 RTL 文本 AFAIK。 Ans 我不想更改我的应用程序的布局,而只是让他们在某些控件中输入 RTL 文本。
      • 您是否尝试了 SetLayoutDirection() 与丰富的控件或 StyledTextCtrl 以查看它是否有效?你不必改变你的程序。只需写一个快速的一次性检查即可。
      • Scintilla 目前在 LTR 文本和指标的 RTL 文本显示方面存在问题(尤其是在 RTL 和 LTR 组合的情况下)。
      • 对不起。我没有意识到这一点。我问过 Robin Dunn(wxPython 的创建者)该怎么做,他认为 SetLayoutDirection() 对你有用,这就是我提到它的原因。
      猜你喜欢
      • 2012-08-15
      • 1970-01-01
      • 2011-08-01
      • 2010-11-09
      • 2012-07-25
      • 1970-01-01
      • 2016-02-22
      • 2012-12-09
      • 2020-08-03
      相关资源
      最近更新 更多