Dot-Net

減少 WinForms 按鈕中文本周圍的填充

  • June 7, 2019

我有一個將在觸摸屏系統上使用的應用程序,它包含許多相當大的按鈕(約 100 像素正方形)。

每個按鈕將有 1 到 4 行文本(通常每行一個單詞)。

由於按鈕中的大量填充,我不得不減小文本的大小,使其變得幾乎不可讀,但是如果我能夠減少內部填充,以便文本可以直接繪製到邊框,那我就沒有問題了。

我試圖將控制項的填充減少到零,如下所示,但這無濟於事。

this.Text = _label;
this.Font = new Font(this.Font.FontFamily, (float) _size);
this.Padding = new Padding(0);

問題範例如下所示:

帶有損壞文本的按鈕

如您所見,“OVERVIEW”一詞有足夠的空間可以放在一行上,但是如何在不減小字型大小的情況下實現這一點?我不喜歡必須重寫控制項的文本繪製程式碼的想法。

編輯:我注意到將填充增加到高達 300 的各種值對控制項的內部填充沒有影響。另外作為參考,我正在使用的按鈕是我從 Windows.Forms.Button 類繼承的控制項,因為我需要添加一些屬性,但是我沒有乾擾任何 Button 自己的方法。

您還可以簡單地重寫繼承自的 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));
       }
   }

您不必自己繪製整個按鈕。只需將 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);
       }
   }
}

引用自:https://stackoverflow.com/questions/6107108