none
请问如何获取比例字体的宽度 RRS feed

  • 问题

  • Graphics g = this.CreateGraphics();
    SizeF sizeF = g.MeasureString("十个汉字占位占位占位"new Font("宋体"10));//十个汉字
    MessageBox.Show(sizeF.Width.Tostring());

    sizeF = g.MeasureString("12345678901234567890"new Font("宋体"10));//20个半角字符

    MessageBox.Show(sizeF.Width.Tostring());

    //程序获得的宽度是一样的 可是实际输出到图片上 是不等宽的
    g.Dispose();

    2012年2月27日 12:39

答案

  • Sorry, 我沒有宋體可以試! 不過,有找到另一個方式,請您試一下,謝謝!

    private void button3_Click(object sender, EventArgs e)
    {
    	Graphics g = this.CreateGraphics();
    	int mywidth = MeasureDisplayStringWidth(g, "十个汉字占位占位占位", new Font("微軟正黑體", 10));
    	MessageBox.Show(mywidth.ToString());
    	int mywidth2 = MeasureDisplayStringWidth(g, "12345678901234567890", new Font("微軟正黑體", 10));
    	MessageBox.Show(mywidth2.ToString());
    }
    
    
    static public int MeasureDisplayStringWidth(Graphics graphics, string text, Font font)
    {
    	System.Drawing.StringFormat format  = new System.Drawing.StringFormat ();
    	System.Drawing.RectangleF   rect    = new System.Drawing.RectangleF(0, 0, 1000, 1000);
    	System.Drawing.CharacterRange[] ranges  =   { new System.Drawing.CharacterRange(0, text.Length) };
    	System.Drawing.Region[] regions = new System.Drawing.Region[1];
    	format.SetMeasurableCharacterRanges (ranges);
    	regions = graphics.MeasureCharacterRanges (text, font, rect, format);
    	rect    = regions[0].GetBounds (graphics);
    	return (int)(rect.Right + 1.0f);
    }

    http://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 liuhong wu 2012年2月28日 13:38
    2012年2月28日 1:23

全部回复

  • 您好,好像是字型的關系!

    我使用您的程式,字型是微軟正黑體,出來分別是141.7448及163.6892哦!

    另外,請試一下TextRenderer.MeasureText

    Size size = TextRenderer.MeasureText("十个汉字占位占位占位", new Font("微軟正黑體", 10));
    MessageBox.Show(size.Width.ToString());
    size = TextRenderer.MeasureText("12345678901234567890", new Font("微軟正黑體", 10)); 
    MessageBox.Show(size.Width.ToString());




    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年2月27日 14:12
  • 确实是跟字体有关系,感觉上这个函数不区分比例字体和等宽字体,我试了TextRenderer.MeasureText 用宋体还是一样,用微软正黑体不一样。
    2012年2月27日 14:20
  • Sorry, 我沒有宋體可以試! 不過,有找到另一個方式,請您試一下,謝謝!

    private void button3_Click(object sender, EventArgs e)
    {
    	Graphics g = this.CreateGraphics();
    	int mywidth = MeasureDisplayStringWidth(g, "十个汉字占位占位占位", new Font("微軟正黑體", 10));
    	MessageBox.Show(mywidth.ToString());
    	int mywidth2 = MeasureDisplayStringWidth(g, "12345678901234567890", new Font("微軟正黑體", 10));
    	MessageBox.Show(mywidth2.ToString());
    }
    
    
    static public int MeasureDisplayStringWidth(Graphics graphics, string text, Font font)
    {
    	System.Drawing.StringFormat format  = new System.Drawing.StringFormat ();
    	System.Drawing.RectangleF   rect    = new System.Drawing.RectangleF(0, 0, 1000, 1000);
    	System.Drawing.CharacterRange[] ranges  =   { new System.Drawing.CharacterRange(0, text.Length) };
    	System.Drawing.Region[] regions = new System.Drawing.Region[1];
    	format.SetMeasurableCharacterRanges (ranges);
    	regions = graphics.MeasureCharacterRanges (text, font, rect, format);
    	rect    = regions[0].GetBounds (graphics);
    	return (int)(rect.Right + 1.0f);
    }

    http://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 liuhong wu 2012年2月28日 13:38
    2012年2月28日 1:23
  • 谢谢您的回复,经测试您的程序能正确反映比例字体和等宽字体的宽度,只是对您的程序还不是很了解,先消化一下。

    再次感谢

    2012年2月28日 13:11