【发布时间】:2014-09-09 04:56:06
【问题描述】:
我想我会尝试一下我自己的简单 TextBox 控件。我不太确定它们是如何编写的,但我查看了 Windows 窗体文本框的参考源,它只是添加了更多问题,所以我想我会问我自己的问题,这些问题基于如何我认为制作了一个 TextBox 控件:
如何绘制字符/文本? 由于我将从头开始创建 TextBox,显然我需要绘制。所以知道当你在 WinForms 中画东西时,你不能只选择那个文本,你需要处理 MouseDown 和 MouseMove 事件,获取鼠标被按下的位置,然后确定哪个字符(如果有)是在那个位置。但我们不能真正做到这一点,除非我们将该角色连同它的坐标一起保存在某个地方。这意味着我们可能需要使用一个列表来存储用户键入的所有内容:
List<Character> characters = new List<Character>();
class Character
{
public string Text { get; set; }
public Location { get; set; }
public Size { get; set; }
}
现在我们已经获得了该角色的位置,我们需要绘制一个填充的矩形,以便用户知道他们在选择什么。我们可以通过在我们之前确定的坐标处获取角色的大小和位置来做到这一点。
这基本上是 TextBox 的工作原理吗?
1) 当用户键入内容时,我们使用 DrawString 绘制“键入”的内容,然后将其大小和位置存储在列表中以供将来参考? 2)当用户“选择”文本时,我们在List中查找用户“选择”的坐标,然后在该位置绘制一个填充矩形?
【问题讨论】:
-
您可能希望将文本存储为
String而不是单个字符,并使用Graphics.DrawString(...)进行渲染。原因是国际字符单独出现与组合在一个单词中时不同。这确实提出了一个关于如何确定正确插入符号位置的有趣问题。 -
@Loathing 这是一个非常好的观点,感谢您提及它。
-
从头开始创建一个文本框是一个非常大的任务。这是可能的,但要让它运作良好将是相当困难的。你的问题中最重要的词是“简单”作为我自己的简单文本框控件.. - 所以你应该制作一个所有的书面列表您要实现的功能。
-
文本框继承自 TextBoxBase,所以即使
textbox.cs也不是一个从头开始的项目。它使用TextRenderer进行输出。 -
文本框有很多额外的功能需要处理才能获得正确的行为。例如,它显示一个闪烁的插入符号,它可以换行,它可以支持使用 Unicode 字体从右到左渲染,它可以处理各种键盘快捷键,在鼠标交互上有不同的行为(单击、双击、三次单击、拖动/删除、突出显示、更改插入符号位置)等。
标签: c# .net winforms drawing gdi+