5

有很多应用程序允许您在按住 Alt 键的同时用鼠标扫过来选择文本框或矩形。例如,Visual Studio 2010 在代码编辑器中执行此操作。Emacs 做到了。Winword 做到了。我们都见过。似乎必须遵循标准模式来编码这种行为,但我似乎找不到它。

我怀疑我没有使用正确的关键字进行谷歌搜索,因为我得到的只是矩形、Alt-Left、扫描、选择等上的错误命中。

我确定我可以对其进行编码,但这意味着禁用在 RichTextBox 中使用的正常选择代码。这听起来很丑陋,容易出错,而且可能比它值得做的工作更多。

有人对如何做到这一点或如何做到这一点有一个建议(很好!:-))吗?

更新:我刚刚在可能适用的代码项目上找到了这篇文章:基于列的选择

4

1 回答 1

4

RichTextBox 经常被误认为是编辑器。这在技术上是可行的,您需要大量代码。首要任务是选择固定间距字体,例如 Courier。

主要问题是您不能使用选择功能,它总是跨越行。您必须使用 SelectionBackColor 属性来伪造它。实现 MouseDown 和 MouseMove 事件,检查 Control.Modifiers 属性以查看 ALT 键是否按下。使用 GetCharIndexFromPosition 查看正在选择的内容。在移动事件中,循环遍历被取消/选择的列和行,使用 SelectionStart、SelectionLength 和 SelectionBackColor 属性为字符着色。

这会像廉价汽车旅馆一样闪烁。P/Invoke SendMessage() 在前后发送 WM_SETREDRAW 消息以避免这种情况。

对选择做一些事情是具有挑战性的。您需要对 RTB 进行子类化,以便可以覆盖 WndProc() 并检测 WM_COPY、WM_CUT、WM_PASTE 消息。其他随机问题是当鼠标靠近控件的顶部或底部时自动滚动,以及在进行另一个选择时取消选择。

或者您可以使用真正的编辑器,例如 ScintillaNET。总而言之,这个答案不太可能得到与问题一样多的支持。

于 2010-06-03T20:16:25.017 回答