2010-07-13 101 views
3

我需要一種方法來確定多列TextBox中的顯示文本的大小,以將Scrollbars屬性設置爲正確的值。如何獲取文本框中顯示的文本的大小

由於它是某種增強MessageBox我的工作,MessageBox的大小應根據字符串中帶有換行符的文本的高度和寬度來確定。

當前我使用此代碼來確定MessageBox的大小,具體取決於要輸入的文本。但是您看到MessageBox已確定MaximiumSize。文本本身的TextBox也啓用了WordWrap。所以未定義的唯一的東西是文本Height插入到TextBox.Text後。

SizeF textSize = this.tbxText.CreateGraphics().MeasureString(message, this.tbxText.Font); 

int frmWidth = picWidth + (int)textSize.Width; 
if (frmWidth > this.MaximumSize.Width) 
{ 
    frmWidth = this.MaximumSize.Width; 
} 
else if (frmWidth < this.MinimumSize.Width) 
{ 
    frmWidth = this.MinimumSize.Width; 
} 

int frmHeight = picHeight + (int)textSize.Height + pnlButtons.Height + pnlInput.Height; 
if (frmHeight > this.MaximumSize.Height) 
{ 
    frmHeight = this.MaximumSize.Height; 
} 
else if (frmHeight < this.MinimumSize.Height) 
{ 
    frmHeight = this.MinimumSize.Height; 
} 

設置TextBox.Scrollbars物業既可作爲默認允許,是不是真的很好,也想在屏幕上滾動禁用。 不幸的是,Graphics.MeasureString真的沒有幫助,因爲它不考慮WordWrap的行爲。

那麼,我怎樣才能確定TextBox.Text是否離開可見區域使一個垂直滾動條需要?

回答

1

似乎很簡單,使用RichTextBox具有相當不同的功能,如Scrollbars只顯示如果需要和不顯示禁用像正常TextBox

隨着RichTextBox我可以將ScrollBars屬性設置爲兩者,它將管理該權利。

2

我會繼續使用Graphics.MeasureString,但您需要添加邏輯來模擬單詞換行,方法是將結果字符串寬度除以控件寬度(即,計算文本框寬度如何適合字符串寬度)以使您的行,然後通過這個來增加字符串高度。

但是請注意,Graphics.MeasureString並不完全準確,但作爲滾動支持的粗略猜測,它可能就足夠了 - 一如既往,測試一下。

+0

似乎這一點工作必須手動完成... – 2010-07-14 07:17:20

0

Graphics.MeasureString重載之一需要width參數(以像素爲單位的最大字符串寬度)。

因此,需要呈現在上面的例子中消息的大小可能是:

SizeF textSize = this.tbxText.CreateGraphics() 
    .MeasureString(message, this.tbxText.Font, this.tbxText.Width); 
... 

對於其他Graphics.MeasureString重載,請參閱:MeasureString overloads (MSDN)

1

某些控件具有AutoSize屬性誰縮小/通過擴大規模內部或通過文本控制,也許你不需要計算。

0

我剛碰到這個問題。我有一個帶有文本框的用戶控件,我想在不用滾動條的情況下顯示它,不管它以什麼尺寸結束。 (這個特定的用戶控件是一個窗口中的一個窗格,窗口可以是縱向或橫向的,我不希望每個佈局都有兩個用戶控件 - 這看起來很愚蠢。)

此代碼,在Load事件處理程序,爲我做:

int iLine = textbox1.GetLineFromCharIndex(textbox1.TextLength - 1) + 1; 
int iHeight = TextRenderer.MeasureText(this.textbox1.Text, this.textbox1.Font).Height; 
float fTextHeight = iHeight * ((float)iLine + 0.25f /* fudge factor */); 
textbox1.Size = new Size (textbox1.Size.Width, (int)fTextHeight); 

This forum post建議選用TextRenderer.MeasureText()

相關問題