为什么Graphics.MeasureString测量阿拉伯语strring错误?

时间:2015-08-18 08:12:38

标签: winforms gdi+ measurestring

我有一个阿拉伯字符串,这是串联阿拉伯字符串和“:100”的结果。此字符串的测量和绘制不正确。为什么呢?

public partial class Form1 : Form {
    string strIncorrectMeasure = "مەھسۇلات باھاسى" + " : " + "100";//"مەھسۇلات باھاسى : 100";
    string strCorrectMeasure = "100 : مەھسۇلات باھاسى";
    Font font = new Font("Oybab tuz", 18);

    public Form1() {
        InitializeComponent();
    }

    void button1_Click(object sender, EventArgs e) {
        var bitmap = new Bitmap(100, 100);
        var graphics = Graphics.FromImage(bitmap);
        StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft | StringFormatFlags.NoFontFallback | StringFormatFlags.NoClip);
        SizeF measuredIcorrectSize = graphics.MeasureString(strIncorrectMeasure, font, 0, format);
        SizeF measuredCorrectSize = graphics.MeasureString(strCorrectMeasure, font);
        MessageBox.Show(string.Format("FirstString : {0}\nSecondString: {1}", measuredIcorrectSize, measuredCorrectSize));
    }
    void Form1_Paint(object sender, PaintEventArgs e) {
        var font = new Font("Oybab tuz", 18);           
        StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
        e.Graphics.DrawString(this.strIncorrectMeasure, font, Brushes.Black, new PointF(300, 10), format);
        e.Graphics.DrawString(this.strCorrectMeasure, font, Brushes.Black, new PointF(10, 50));
    }
}

此问题是否可能是由此特定字体引起的?

2 个答案:

答案 0 :(得分:0)

我还没有找到解决方案。我认为,这个问题在字体本身。其他字体工作正常。

答案 1 :(得分:-1)

我找不到Oybab tuz字体。但是,使用SystemFonts.MenuFontSystemFonts.DefaultFont,两种尺寸都相同。

使用Graphics.MeasureStringMenuFont返回的值为162.1289。但是,在位图编辑器中截取屏幕截图并测量真实宽度会产生155像素的宽度。如果你需要真正的宽度,那么你需要将文本绘制到位图,然后通过查看像素值找到边界矩形。

此外,您无需创建Bitmap即可获取Graphics个对象。只需致电CreateGraphics()即可。此外,您应该通过将对象包装在using语句中来处置它们。