原文來自: 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)的許可。
下面的分享和作者介紹的部分就不翻譯了