none
GraphicsPath.AddString()字体大小 RRS feed

  • 问题

  • 我把TextBox中的字符串通过GraphicsPath.AddString()添加路径,然后通过Graphics.FillPath()把路径画在窗体上面。用AddString()添加路径的时候是用的TextBox中的字体,但是最后发现画出来的字符串和TextBox中的字符串大小不一致。请问这是怎么回事呢?该如何解决呢?

    主要代码如下:

            private void button1_Click(object sender, EventArgs e)
            {
                this.Refresh();

                GraphicsPath path = new GraphicsPath();
                path.AddString(
                    textBox1.Text,
                    textBox1.Font.FontFamily,
                    (int)textBox1.Font.Style,
                    textBox1.Font.Size,
                    new Point(textBox1.Left, textBox1.Bottom + 40),
                    StringFormat.GenericTypographic);

                Graphics g = this.CreateGraphics();
                g.SmoothingMode = SmoothingMode.AntiAlias;
                g.TextRenderingHint = TextRenderingHint.AntiAlias;

                g.FillPath(new SolidBrush(textBox1.ForeColor), path);

                path.Dispose();
            }

    2011年5月13日 14:03

答案

全部回复

  •  float emsize = textBox1.Font.Height * textBox1.Font.FontFamily.GetCellAscent(textBox1.Font.Style) / 
        textBox1.Font.FontFamily.GetEmHeight(textBox1.Font.Style);
    
       GraphicsPath path = new GraphicsPath();
       path.AddString(
        textBox1.Text,
        textBox1.Font.FontFamily,
        (int)textBox1.Font.Style,
        emsize,
        new Point(textBox1.Left, textBox1.Bottom + 40),
        StringFormat.GenericTypographic);
    

    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月16日 12:27
    版主
  • Mike Dos Zhang

    谢谢你的回复。上面的的方法好像只对少数的几种字体有效,例如我用“华文仿宋”这种字体时,大小又不一致了。

    2011年5月16日 14:19
  • 据我所知.net没有内置的方法去解决这个问题,

    你需要自己写算法来画出你要用的字体。

     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 YeHong 2011年5月18日 12:43
    2011年5月18日 10:57
    版主
  • 是的,好像确实没有。谢谢你的回复!
    2011年5月18日 12:42
  • 不过你得这段代码的效果可以用WPF很容易实现,WPF是基于Direct2D去绘制界面的,所以在于GDI这方面的一些限制,他并不存在。下面是我的WPF例子,你可以看看:http://msdn.microsoft.com/en-us/library/ms752098.aspx
    C#:
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
    
        private void button1_Click(object sender, RoutedEventArgs e)
        {
          MyControl control = new MyControl()
          {
            Text = textBox1.Text,
            FontSize=textBox1.FontSize,
            TypeFace = new Typeface(textBox1.FontFamily, textBox1.FontStyle, textBox1.FontWeight, textBox1.FontStretch)
          };
          canvas1.Children.Clear();
          canvas1.Children.Add(control);
        }
      }
    
      public class MyControl : Control
      {
        public string Text { get; set; }
        public Typeface TypeFace { get; set; }
        public double FontSize { get; set; }
        protected override void OnRender(DrawingContext drawingContext)
        {
          FormattedText formattedText = new FormattedText(
                   Text,
                   CultureInfo.GetCultureInfo("zh-cn"),
                   FlowDirection.LeftToRight,
                   TypeFace,
                   FontSize,
                   Brushes.Black);
          drawingContext.DrawText(formattedText, new Point(10, 120));
          base.OnRender(drawingContext);
        }
      }
    
     
    WPF XAML:
    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="138,11,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <Canvas Height="100" HorizontalAlignment="Left" Margin="23,77,0,0" Name="canvas1" VerticalAlignment="Top" Width="431" />
      </Grid>
    </Window>
    
    
    Sincerely,

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月18日 15:49
  • 不用谢,:)。

    但是,如果你需要做一些GDI比较难做的效果,那么希望你考虑使用WPF,就像Bob说的那样。

     

     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月19日 8:22
    版主
  • 恩,是的。在WPF上面效果很好。

    2011年5月21日 13:15
  • 恩,好的。感谢你和Bob的热心解答。
    2011年5月21日 13:17
  •    : )
    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月22日 7:31
    版主