簡體   English   中英

TextRenderer.MeasureText 結果的准確性

[英]Accuracy of TextRenderer.MeasureText results

調用 TextRenderer.MeasureText 如下:

TextRenderer.MeasureText(myControl.Text, myControl.Font);

並將結果與控件的大小進行比較以檢查文本是否適合。 結果有時不正確。 觀察到以下兩個問題:

  • 通常當 Label 設置為 AutoSize 時,TextRenderer 將報告寬度比控件的自動調整寬度寬 1 個像素。
  • TextRenderer 報告的寬度小於控件的寬度但文本仍被截斷的錯誤否定。 這發生在“Estación de trabajo”中——不確定口音是否會以某種方式影響寬度計算?

有什么方法可以提高MeasureText方法的准確性嗎? 我應該調用接受設備上下文和/或格式標志的覆蓋之一嗎?

我知道現在可能已經不存在了。 但是,對於將來的讀者來說,這是一種簡單而准確的方法來測量控件中的文本:

Graphics g=Graphics.FromHwnd(YOUR CONTROL HERE.Handle);
SizeF s=g.MeasureString("YOUR STRING HERE", Font, NULL, NULL, STRING LENGTH HERE, 1)

有什么方法可以提高MeasureText方法的准確性嗎? 我應該調用接受設備上下文和/或格式標志的替代之一嗎?

您已經自己回答了問題。 實際上是基於Win32 DrawTextEx的MeasureText,如果沒有有效的設備上下文,此功能將無法使用。 因此,當您調用不帶hdc的MeasureText覆蓋時,它將在內部創建與桌面兼容的hdc來進行測量。

當然,度量取決於其他TextFormatFlags。 另外請記住,標簽繪畫(和度量)取決於UseCompatibleTextRendering

因此,一般的結論是您應該為自己的代碼使用MeasureText,例如,當您隨后使用完全相同的參數調用DrawText時,在所有其他情況下,MeasureText返回的大小不能視為精確值。

如果需要獲取預期的Label大小,則應使用GetPreferredSize方法。

我不知道我是否有一個完美的解決方案,但是幾年前我在使用WinForms時遇到了這個問題。 我最終的補償方式是將返回的測量值調整一個百分比。 我不記得我用過什么(可能是5%或105?),但我確實記得我最終在整個應用程序中使用了恆定的百分比,並且總是四舍五入。

簽出此函數的TextFormatFlags參數:

TextRenderer::MeasureText(String, Font, Size, TextFormatFlags) 

http://msdn.microsoft.com/zh-CN/library/8wafk2kt.aspx

“以指定的字體在單行上繪制的文本的大小(以像素為單位)。您可以使用帶有TextFormatFlags參數的DrawText重載之一來操縱如何繪制文本。例如,TextRenderer的默認行為是在所繪制的文本的邊界矩形中添加填充以容納懸垂的字形如果您需要繪制一行文本而沒有這些多余的空格,則應使用DrawText和MeasureText的版本,這些版本帶有Size和TextFormatFlags參數。例如,請參閱MeasureText(IDeviceContext,String,Font,Size,TextFormatFlags)。”

hth

我還沒有足夠的評論點,所以我不得不把這個作為答案:

也許 ClearType 會影響測量精度,因為盡管一個字符具有從其字形計算出的已知寬度,但它的渲染和 position 被調整為在整個像素上放置軸線。

只是一個想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM