設置TextBox控件的高度文檔翻譯

原文來自: 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)的許可。


下面的分享和作者介紹的部分就不翻譯了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章