首頁>Program>source

這不是一个四舍五入的問题.相差約5+畫素。

測試用例字元串:"" MACD(26,12,9)-0.000016"

e.Graphics.MeasureString("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width)
TextRenderer.MeasureText("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width)

結果始终為:

139.3942
134

為什麼尺寸差異如此之大? 我只需要外部绘画方法的字元串宽度的一轮.但是應该匹配MeasureString,反之亦然。

最新回復
  • 5月前
    1 #

    TextRenderer 使用GDI渲染文字,而 Graphics 使用GDI +.两者使用的文字佈局方式略有不同,因此大小不同。

    您應该使用哪一个取決於最终將用於實際绘製文字的內容.如果使用GDI + Graphics.DrawString绘製 ,使用 Graphics.MeasureString測量 .如果使用GDI TextRenderer.DrawText绘圖 ,使用 TextRenderer.MeasureText測量

    如果文字將顯示在windows窗體控制元件中,則使用 TextRenderer 如果 UseCompatibleTextRendering 設置為 false (這是預設設置)。

    在問题的两句之間阅讀,您似乎在使用 TextRenderer 因為你没有 Graphics Paint之外的例項 事件.如果是這樣,您可以自己建立一个进行測量:

    using( Graphics g = someControl.CreateGraphics() )
    {
        SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
    }
    

    如果您無權建立圖形例項的控制元件,則可以使用该控制元件為螢幕建立一个例項,這樣可以很好地用於測量目的。

    using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) )
    {
         SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
    }
    

  • 5月前
    2 #

    我製作了以下類,以便在paint事件之外使用MeasureString,並且效果很好。

    public interface ITextMeasurer
        {
            SizeF MeasureString(string text, Font font, StringFormat format);
        }
        public class TextMeasurer : ITextMeasurer
        {
            private readonly Image _fakeImage;
            private readonly Graphics _graphics;
            public TextMeasurer()
            {
                _fakeImage = new Bitmap(1, 1);
                _graphics = Graphics.FromImage(_fakeImage);
            }
            public SizeF MeasureString(string text, Font font, StringFormat format)
            {
                return _graphics.MeasureString(text, font, int.MaxValue, format);
            }
        }
    

相似問題

  • 如何在PHP中重新格式化日期?
  • java:自動調整JTable列的宽度