2

所以我目前有一个 ScrolledPanel,其中包含许多以编程方式放置在垂直 BoxSizer 中的 TextCtrl。我这样做而不是仅仅将行附加到一个大的滚动 TextCtrl 的原因是,我还可以在 TextCtrl 之间添加其他控件,例如图像或风格化的展开/收缩折叠的东西。

然而,这个特定的实现会导致一个问题——即用户不可能跨多个 TextCtrl 选择文本。有没有一种方法可以快速、干净、惯用并且不是特别笨拙?我最好的选择是编写一个指针位置文本选择算法,该算法本质上是为底层本机库的文本选择内容重新发明轮子,还是有一种更简单的方法可以将其他控件嵌入到多行可滚动 TextCtrl 中,甚至选择文本多个TextCtrls本机?

4

1 回答 1

1

如果可能的话,我会远离尝试重新实现文本选择控件,因为这势必会很快变得非常混乱。解决此问题的另一种方法是使用单个多行 textctrl 小部件,并在其上附加其他小部件。这也很混乱,但不那么混乱。

您可以将其他小部件放在 textctrl 上,只需将它们直接放在与 textctrl 相同的位置,只要其他小部件与 textctrl 具有相同的父级即可。只要您不与 vscrollbar 重叠(或者更好的是,使用 style=wx.TE_NO_VSCROLLBAR 将其完全删除),这应该可以工作。

您需要做的下一件事是预先填充和间隔您的 textctrl,以便用户仅在每个小部件的位置之后才能控制文本。您应该为每一行文本设置不同的间距设置,使用 wx.TextAttr 的间距选项进行设置(双间距的更通用版本等),您可以根据您为应用程序提供的特定小部件间距计算这些选项. 这对于强制用户仅在您希望他们输入的位置准确键入是必要的。

接下来,您需要设置与 textctrl 换行符的绑定,以重新计算每行所需的间距。一旦你弄清楚如何处理间距,这应该不会太难。

最后,在您选择文本后,只需将所有内容重置为相同的间距,或者其他任何适合您的方式,这样当您将其粘贴回其他地方时,您就不会遇到尴尬的换行符。

我知道这是一个复杂的答案,但这是你提出的一个复杂的问题。我相信,这是解决它的最有效方法,并且避免了完全检修 textctrl 可能出现的所有错误,但它确实涉及搞乱自动更正换行符和间距,一开始可能有点棘手.

于 2013-05-16T16:43:20.117 回答