在WinForms按钮中减少文本周围的填充

Bry*_*yan 12 .net fonts paint button winforms

我有一个将在触摸屏系统上使用的应用程序,它包含许多相当大的按钮(~100px square).

每个按钮将有1到4行文本(通常每行一个单词).

由于按钮中有大量的填充,我不得不减小文本的大小,使其变得几乎不可读,但是如果我能够减少内部填充,那么文本将直接绘制到边框那我就不会有问题了.

我试图将控件的填充减少到零,如下所示,但它没有帮助.

this.Text = _label;
this.Font = new Font(this.Font.FontFamily, (float) _size);
this.Padding = new Padding(0);
Run Code Online (Sandbox Code Playgroud)

问题的一个示例如下所示:

按钮与破碎的文本

正如您所看到的,"OVERVIEW"这个词有足够的空间放在一行上,但是如何在不缩小字体大小的情况下实现这一目标呢?我不喜欢不得不重写控件的文本绘画代码.

编辑:我注意到将填充增加到高达300的各种值,对控件的内部填充没有任何影响.另外,对于信息,我正在使用的按钮是我从Windows.Forms.Button类继承的控件,因为我需要添加一些属性,但是我没有干涉任何Button自己的方法.

小智 7

您不必自己绘制整个按钮.只需将Text属性保留为空,并将文本分配给OwnerDrawText

public class NoPaddingButton : Button
{
    private string ownerDrawText;
    public string OwnerDrawText
    {
        get { return ownerDrawText; }
        set { ownerDrawText = value; Invalidate(); }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (string.IsNullOrEmpty(Text) && !string.IsNullOrEmpty(ownerDrawText))
        {
            StringFormat stringFormat = new StringFormat();
            stringFormat.Alignment = StringAlignment.Center;
            stringFormat.LineAlignment = StringAlignment.Center;

            e.Graphics.DrawString(ownerDrawText, Font, new SolidBrush(ForeColor), ClientRectangle, stringFormat);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


hel*_*rve 6

您还可以简单地覆盖您继承的Button控件的OnPaint()方法,并省略调用base.OnPaint(),并将其替换为您自己的绘图代码.

    protected override void OnPaint(PaintEventArgs pevent)
    {
        //omit base.OnPaint completely...

        //base.OnPaint(pevent); 

        using (Pen p = new Pen(BackColor))
        {
            pevent.Graphics.FillRectangle(p.Brush, ClientRectangle);
        }

        //add code here to draw borders...

        using (Pen p = new Pen(ForeColor))
        {
            pevent.Graphics.DrawString("Hello World!", Font, p.Brush, new PointF(0, 0));
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • Bryan,调用 pevent.Graphics.MeasureString(...) 并将 SizeF 结果与按钮的 ClientRectangle 进行比较。几行数学应该可以让您轻松地将文本居中。然后您也可以开始应用自动椭圆;) (2认同)