我想使用 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/