在使用StringFormat重载时,DrawString会忽略制表符

时间:2014-08-07 10:58:00

标签: c# .net winforms drawing

我有一个表单从文本框中读取文本,然后使用DrawString中的System.Drawing.Graphics方法绘制文本。

根据我使用的过载情况,结果会有所不同。需要额外StringFormat的重载似乎忽略了标签。没有StringFormat的重载就可以了。

结果如下:

enter image description here

这是代码:

    public Form1()
    {
        InitializeComponent();
        textBox1.AcceptsTab = true;
        textBox1.Multiline = true;
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        { 
            Graphics g = this.CreateGraphics();
            Font font = new Font("Arial", 20);

            StringFormat format = StringFormat.GenericDefault;
            format.Trimming = StringTrimming.None;

            g.DrawLine(new Pen(Color.Black), new Point(10, 50), new Point(10, 140));

            g.DrawString(textBox1.Text, font, Brushes.Black, new Point(10,60));
            g.DrawString(textBox1.Text, font, Brushes.Black, new Point(10,100), format);

        }
    }

似乎我可以通过调用format.SetTabStops()手动设置TabStop,但这不是首选解决方案。

我尝试设置format.Trimming = StringTrimming.None,但这不起作用。

是否有可能在使用StringFormat重载时从文本中打印标签?

1 个答案:

答案 0 :(得分:0)

是的,它看起来像Graphics.DrawString的设计谬误 - 具有不太详细的过载和更详细的过载,例如:

DrawString(String, Font, Brush, PointF)
DrawString(String, Font, Brush, PointF, StringFormat)

- 它不允许以一种完全类似于不太详细的重载行为的方式调用更详细的重载。

例如:

  • 调用graphics.DrawString(…, new StringFormat())会使所有标签为零宽度;
  • 调用var stringFormat = new StringFormat(); stringFormat.SetTabStops(0, new float[] { 8 }); graphics.DrawString(…, stringFormat)会使所有标签的宽度为8像素,而不是8个空格;
  • 当然,您可以修改var stringFormat = new StringFormat(); stringFormat.SetTabStops(0, new float[] { Font.SizeInPoints / 2 * e.Graphics.DpiX / 72 * 8 }); graphics.DrawString(…, stringFormat)之类的内容 - 事实上它的工作原理(指定的标签宽度与StringFormat的标签宽度重合 - 少{{ 1}} - call; DrawString数组中的最后一项应用于所有其他选项卡) - 但是文档的任何部分都不能保证它将来不会发生变化。

当然,技术上调用float[] - 更少StringFormat重载相当于将DrawString传递到null参数 - 但这在实践中并没有帮助(例如,如果您想指定一些StringFormat属性,但保留默认的tab-behavior)。