4

重要提示:我们确实需要所述功能,因此请不要开始建议替代方案。

我们正在尝试在包含文本和非文本区域的自定义 WinForms 控件上显示和输入文本 - 换句话说,现代画布。

我们需要能够在自定义控件上以各种缩放级别显示文本和插入符号,并使用其他自定义效果。但是,我们不希望(或有资金)编写键盘和鼠标输入法代码、线路服务代码等 - 解决方案必须支持标准 TextBox 支持的所有语言。

因此,我们正在考虑的方法是使用隐藏文本框,并在适​​当的翻译后将键盘和鼠标事件路由到它,并使用其公共访问器来确定字符的布局方式。从理论上讲,这将使我们能够突出显示选定的文本、绘制插入符号、在用户按下键时执行正确的操作(包括使用键盘选择和删除文本。)

换句话说,文本区域是隐藏文本框的代理。结果是我们建立在文本框的功能之上,同时克服了它的限制,例如缺乏缩放等。

我们希望显示部分是可行的,但键盘和鼠标输入可能非常棘手。

问题:以前尝试过这种方法并取得成功吗?任何工作代码都会很棒。

更新:一个快速而肮脏的实验似乎表明 TextBox 不尊重鼠标消息中发送的鼠标坐标,但似乎直接读取当前鼠标位置。因此,一个新的问题:

是否可以通过直接 TextBox 操作来转换所有 TextBox 鼠标事件,以一种适用于所有语言的方式?我们猜测命中测试方法 GetCharIndexFromPosition 和文本选择方法 Select 应该足够了。这看起来合理吗?

4

1 回答 1

1

我建议您按照您的建议使用隐藏的 TextBox,然后向其发送 WM_PRINT 消息,以便将其内容绘制到位图上。然后,您可以将该位图绘制到实际感兴趣的区域上,并应用缩放或旋转等更改。任何键盘消息都可以简单地转发到隐藏的文本框,因此插入符号和内容将按照用户的预期进行更新。棘手的部分只是鼠标处理。您需要获取客户端坐标,然后使用反向变换(缩放、旋转等)从客户端获取隐藏文本框的实际坐标。

于 2010-09-03T05:17:36.997 回答