疑问:Graphics.DrawString右对齐时为何不绘制末尾空格字符?
问题描述
我使用的字符串是末尾带有10个空格的"Hello World ",但在设置为右对齐(StringAlignment.Far)的情况下,Graphics.DrawString会省略所有末尾空格,仅绘制出"Hello World"。
相关代码如下:
protected override void OnPaint(PaintEventArgs e) { Rectangle rct = new Rectangle(20, 100, 200, 20); e.Graphics.DrawRectangle(new Pen(Color.Lime), rct); e.Graphics.DrawString("Hello World ", Font, new SolidBrush(SystemColors.ControlText), rct, new StringFormat() { Alignment = StringAlignment.Far}); base.OnPaint(e); }
绘图效果:
解决方案
这是因为StringFormat默认会修剪字符串的首尾空白,要保留末尾空格,只需修改StringFormat的FormatFlags属性,禁用StringFormatFlags.TrimTrailingSpaces即可:
修改后的代码:
protected override void OnPaint(PaintEventArgs e) { Rectangle rct = new Rectangle(20, 100, 200, 20); e.Graphics.DrawRectangle(new Pen(Color.Lime), rct); var format = new StringFormat() { Alignment = StringAlignment.Far, // 禁用末尾空格修剪 FormatFlags = StringFormatFlags.NoWrap & ~StringFormatFlags.TrimTrailingSpaces }; e.Graphics.DrawString("Hello World ", Font, new SolidBrush(SystemColors.ControlText), rct, format); base.OnPaint(e); }
原理:StringFormat的默认FormatFlags包含TrimTrailingSpaces,会自动移除字符串末尾的空格。通过~StringFormatFlags.TrimTrailingSpaces取反并与默认的NoWrap(默认包含)做按位与,就能保留末尾空格,同时不影响其他默认行为。
内容的提问来源于stack exchange,提问作者qtg
相关产品推荐
相关产品推荐

