You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

疑问: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:10:29