我想使用 Graphics.DrawString() 方法打印,但我想从上到下打印。

例如我有字符串“Hello”,我想被打印

H
e
l
l
o

只有一个 Graphics.DrawString()
有可能吗?因为我有动态的文本长度。

最佳答案

这是垂直显示文本而不是旋转的代码。
在第一个面板中,文本左对齐,在第二个和第三个面板中,它居中。
要显示的文本只是 Panel.Text,而 Font 是面板的字体。

第一种解决方案只使用一个 DrawString;它只是在所有字符之间插入换行符。

第二个面板看起来好多了,您可以指定正或负的 leading,但代码更复杂 - 一分钱一分货。

(除了这里 SO ;-)

private void panel1_Paint(object sender, PaintEventArgs e)
{
    string s = "";
    foreach(char c in panel1.Text) s += c.ToString() + "\r\n";
    e.Graphics.DrawString(s, panel1.Font, Brushes.Black, Point.Empty);
    SizeF sf = e.Graphics.MeasureString(s, panel1.Font);    //**
    panel1.Size = new Size((int)sf.Width, (int)sf.Height);  //**
}

private void panel2_Paint(object sender, PaintEventArgs e)
{
    float leading = -1.75f;  // <-- depends on font and taste
    float maxWidth = 0f;  //**
    Dictionary<char, Size> charSizes = new Dictionary<char, Size>();
    foreach (char c in panel2.Text)
        if (!charSizes.ContainsKey(c))
        {
            SizeF sf = e.Graphics.MeasureString(c.ToString(), panel2.Font);
            charSizes.Add(c, new Size((int)sf.Width, (int)sf.Height) );
            if (maxWidth < (int)sf.Width) maxWidth = (int)sf.Width;   //**
        }
    panel2.Width = (int)(maxWidth * 2);   // for panel size  //**
    float y = 0f;
    foreach (char c in panel2.Text)
    {
        e.Graphics.DrawString(c.ToString(), panel2.Font, Brushes.Black,
                   new Point( ( panel2.Width - charSizes[c].Width) / 2, (int)y) );
        y += charSizes[c].Height + leading;
    }
    panel2.Height = (int)y;  //**
}

编辑://** 添加了调整面板大小的代码

这是一个截图;中间面板的领先 +2.75f 右侧的 +5f:

关于c# - 拉绳从上到下向右(像中国旧式),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24970839/

10-12 12:37