2011-05-24 107 views
10

我有一個將用於觸摸屏系統的應用程序,它包含一些相當大的按鈕(~100px正方形)。減少在WinForms按鈕中的文本週圍的填充

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

由於按鈕中存在大量填充,我不得不減小文本的大小以使其幾乎不可讀,但是如果我能夠減少內部填充以便文本正確繪製直到邊界,那麼我不會有問題。

我試圖減少控件的填充到零如下,但它沒有幫助。

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

問題的一個例子如下所示:

Button with broken text

正如你可以看到有很多的字「概覽」,以適應在一行的空間,但我怎麼能在不減少字體大小的情況下實現這一點我不喜歡想重寫控件的文字繪畫代碼。

編輯:我注意到,增加填充高達300的各種值,對控件的內部填充沒有任何影響。此外,對於信息,我使用的按鈕是從Windows.Forms.Button類繼承的控件,因爲我需要添加一些屬性,但是我沒有干涉任何Button自己的方法。

回答

5

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

這將是我的首選方法,但它並不那麼簡單,因爲現有的繪畫事件將處理文本在邊界內的包裝和定位,所以我不喜歡走這條路,除非有什麼簡單的方法來實現這個目標? – Bryan 2011-05-24 09:05:58

+1

接受,因爲Graphics.DrawString確實使文本換行和定位變得容易。完美的作品,非常感謝。 – Bryan 2011-05-24 09:21:38

+0

酷,比我的建議更簡單,它聽起來像它的作品。 +1 – Jodrell 2011-05-24 09:29:08

3

我在98年使用MFC創建了一個成功的無線電自動化應用程序。我們所做的第一件事是我們爲它創建了一套全新的GUI控件,例如,用手指按住屏幕上的按鈕使其變得模糊,而標準按鈕則不那麼奇怪。

fireplay image

我的建議是不要去推導從標準的WinForms按鈕的按鍵,但是從Control,做繪圖自己。如果它是您呈現的簡單按鈕,則不需要執行任何操作,只需使用DrawString,如果它稍微複雜一點,則可以完全控制它。

+2

哇,看起來很酷:) – 2011-05-24 09:05:50

+0

這是我的一個好朋友創建:http://studionebo.com/gui.html – 2011-05-24 14:37:13

+0

什麼樣的設計,看起來很酷!鏈接不再工作。 – JohnSaps 2014-05-20 08:14:54

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); 
     } 
    } 
} 
1

@Bryan - 由@Henk魯和@chiper提出了兩種解決方案是不完美的。首先生成沒有任何視覺屬性的按鈕,然後迫使我們添加新的屬性,如OwnerDrawText

查看我的建議如下。我覆蓋Text屬性以便能夠使用其專用部分_Text並在MyBase.OnPaint(e)事件之前附加String.Empty。這使得該按鈕繪製時沒有文字。後來我重新將舊文本重新分配給私有屬性並自己繪製字符串。我將Inflate添加到Rectangle以使文本更好地觸摸按鈕的邊框,而不是重疊它。我的建議適用於任何flatstyle

Here is comparison of standard and no padding button in two flatstyles: standard and flat

Imports System.ComponentModel 
Imports System.Drawing 
Imports System.Windows.Forms 

Public Class ButtonNoPadding 
    Inherits Button 

    Private _textCurrent As String 
    Private _Text As String 

    <Category("Appearance")> 
    Public Overrides Property Text() As String 
     Get 
      Return _Text 
     End Get 
     Set(ByVal value As String) 
      If value <> _Text Then 
       _Text = value 
       Invalidate() 
      End If 
     End Set 
    End Property 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 

     _textCurrent = Text 
     _Text = String.Empty 
     MyBase.OnPaint(e) 
     _Text = _textCurrent 

     Using brush = New SolidBrush(ForeColor) 
      Using stringFormat = New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center} 
       e.Graphics.DrawString(Text, Font, brush, Rectangle.Inflate(ClientRectangle, -2, -2), stringFormat) 
      End Using 
     End Using 

    End Sub 

End Class 

C#版本:

using Microsoft.VisualBasic; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

public class ButtonNoPadding : Button 
{ 

    private string _textCurrent; 

    private string _Text; 
    [Category("Appearance")] 
    public override string Text { 
     get { return _Text; } 
     set { 
      if (value != _Text) { 
       _Text = value; 
       Invalidate(); 
      } 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     _textCurrent = Text; 
     _Text = string.Empty; 
     base.OnPaint(e); 
     _Text = _textCurrent; 

     using (brush == new SolidBrush(ForeColor)) { 
      using (stringFormat == new StringFormat {Alignment = StringAlignment.Center,LineAlignment = StringAlignment.Center}) { 
       e.Graphics.DrawString(Text, Font, brush, Rectangle.Inflate(ClientRectangle, -2, -2), stringFormat); 
      } 
     } 

    } 

} 
相關問題