原文来自: https://www.codeproject.com/Articles/29140/Set-TextBox-Height
翻译:Jeffrey Chou
设置TextBox控件的高度(Set TextBox Height)
如何如改变单行TextBox的高度。
目录
设置TextBox控件的高度(Set TextBox Height)
工程代码
Download user control - 11.11 KB
Download test project - 23.28 KB
简介
这篇文章是介绍如何去设置一个单行TextBox控件的高度。在C#中(或者是VB.NET中),对于TextBox这个控件,它忽略了高度的属性并自动调增它自己来适应字体的高度。通过计算确切的我们需要的字体大小,我们可以设置TextBox一个我们想要的高度。
背景
我有一个C#的项目需要一个可以适应高度的单行TextBox。我寻找到了很多的如何去适应宽度的例子,但是并没有找到实现如何的动态调整一个TextBox高度的例子。此外,我并不想去使用多行的TextBox,因为我想保持单行额的TextBox自动完成的特性(the auto-complete features)。
使用的代码
单行的TextBox是通过字体的大小来设置高度的,而不是通过TextBox自身的高度属性。如果你想要了解一个确切的高度,这将会变的很困难。幸运的是,字体的属性使用一个浮点值(a float)表示他的大小(emSzie)。你可以使用字体的分数来微调文本框的高度。
通过计算来确定所使用的TextBox的高度:
Height = ( Font Size * Font Line Spacing / Font Em Height ) + 7
•Font Size – 以像素为单位来测量字体的大小是最简单的,所以你不需要要屏幕的DIO中考虑DPI中的因素。
•Font Line Spacing - 在设计单元中,在两条连续的文本行之间的距离。
•Font Em Height - 在字体最宽的字母的设计单位中,通常是字母m。
TextBox在字体高度周围有3像素低和4像素的上白色空间。因此,计算增加了7像素的高度。
我们可以颠倒这个计算来获得所需高度所需的字体大小:
Font Size = ( height - 7 ) * Font Em Height / Font Line Spacing
此方法将返回一个字体对象,该字体对象根据所设定的TextBox高度得到:
private Font GetFontForTextBoxHeight(int TextBoxHeight, Font OriginalFont)
{
// 想要的TextBox高度值
float desiredheight = (float)TextBoxHeight;
// 通过已经存在的Font对象来设置新的Font对象。
// 我们通过使用fnt=new Font(...)构造函数,所以我们可以确信我们已经将GraphicsUnit设置为了
// Pixels。这避免了点和像素之间的DPI的转换。
Font fnt = new Font(OriginalFont.FontFamily,
OriginalFont.Size,
OriginalFont.Style,
GraphicsUnit.Pixel);
// TextBoxes不能小于8个像素的大小。这8个像素的组成为4个像素的顶部空白和3个像素的底部空白,以及1个像素最小的希腊符号文本。
if (desiredheight < 8)
desiredheight = 8;
// 确定Font对象额Em大小和Font的行间距。
// 对于每一个Font对象,这些值将会是在字体样式中被给出的常数以及屏幕的DPI数据
float FontEmSize = fnt.FontFamily.GetEmHeight(fnt.Style);
float FontLineSpacing = fnt.FontFamily.GetLineSpacing(fnt.Style);
// emSize是我们需要的字体的大小。
// TextBoxes共有7个像素的上下空白的像素距离。
float emSize = (desiredheight - 7) * FontEmSize / FontLineSpacing;
// 创建我们需要的适当大小的字体
fnt = new Font(fnt.FontFamily, emSize, fnt.Style, GraphicsUnit.Pixel);
return fnt;
}
每当您必须设先置文本框大小时,使用上面的方法设置字体属性:
YourTextBox.Font = GetFontForTextBoxHeight(DesiredHeight, YourTextBox.Font);
使用控件
这个“可调节高度的”TextBox是一个可以添加到你项目中的一个用户控件。它的行为与常规文本框相同,只是:
- 你可以在设计模式视图下,通过“Size_AdjustableHeigh”属性,设置TextBox高度;
- 如果在单行的模式下,控件将响应填充(Dock)和锚固(Anchoring);
如何使用控件:
1.在设计器模式下,在你的工具箱的空的地方右键;
2.点击浏览。然后导航到AdjustableHeightTextbox.dll。最后点击确定;
3.添加该控件到你的窗体;
(这里说的太麻烦,直接将dll拖入工具箱的面板中,vs会自动导入,然后找到控件使用即可。= =)
使用愉快!
关于
- 我了解到.NET文本框代码基本上是旧MFC文本框控件的包装器。这就是为什么它不是非常可定制的。
- 函数GetFontForTextBoxHeight()的过程,可以通过一些调整,来说用到ComboBox中。高度计算是接近的,但只是有几个像素的不同(【译者注】:这里估计是上3下4的像素值不同)。
这里缺少关于文本框控件内部操作的信息(与大多数标准.NET控件一样)。我希望这篇文章能帮你节省几个小时的搜索时间。
历史
2008.09.07 - 发表原创文章(本文)
2008.09.10 - 添加了文本框的用户控件版本和测试项目
许可证
本文连同任何相关的源代码和文件,通过了The Code Project Open License (CPOL)的许可。
下面的分享和作者介绍的部分就不翻译了