2010-10-30 90 views
0

我有2個groupboxes,我想定製一些,我不想求助於具有標籤的面板(這將意味着我會有如果我需要一個邊框,則面板和父控件的背景顏色相同,因爲標籤必須設置顏色才能覆蓋文字背後的邊框)。C#Groupbox - 自定義邊框/標題的外觀和感覺

我已經設法捕捉油漆事件,並使用下面的代碼更改邊框顏色:

Graphics gfx = e.Graphics; 
Pen p = new Pen(Color.FromArgb(86, 136, 186), 3); 

GroupBox gb = (GroupBox)sender; 
Rectangle r = new Rectangle(0, 0, gb.Width, gb.Height); 

gfx.DrawLine(p, 0, 5, 0, r.Height - 2); 
gfx.DrawLine(p, 0, 5, 10, 5); 
gfx.DrawLine(p, 62, 5, r.Width - 2, 5); 
gfx.DrawLine(p, r.Width - 2, 5, r.Width - 2, r.Height - 2); 
gfx.DrawLine(p, r.Width - 2, r.Height - 2, 0, r.Height - 2); 

我的問題是,像這樣的,如果標題太長那麼重疊的邊界。因爲它與頂部的左側邊框重疊 - 只需調整第二行DrawLine即可輕鬆解決。不過,我想檢測文本的x和寬度測量值,以便我可以正確定位邊框。

有沒有人有任何想法如何做到這一點?我在Google上看了一段時間,但沒有發現任何內容。我知道標題是通過GroupBox.Text設置的。

也請說出是否有任何其他測量可能需要,基於我改變邊框的粗細,所以如果字體很小但邊界是10像素開始半邊向下看起來很奇怪。 。

在此先感謝。

問候,

理查德

回答

2

很容易得到字符串的大小,因爲我看到你已經發現了。但我認爲控制的子類化會更容易,允許更好的外觀爲您提供設計時間支持。這裏有一個例子:

public class GroupBoxEx : GroupBox 
{ 
    SizeF sizeOfText; 
    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     CalculateTextSize();    
    } 

    protected override void OnFontChanged(EventArgs e) 
    { 
     base.OnFontChanged(e); 
     CalculateTextSize(); 
    } 

    protected void CalculateTextSize() 
    { 
     // measure the string: 
     using (Graphics g = this.CreateGraphics()) 
     { 
      sizeOfText = g.MeasureString(Text, Font); 
     } 
     linePen = new Pen(Color.FromArgb(86, 136, 186), sizeOfText.Height * 0.1F); 
    } 

    Pen linePen; 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     // Draw the string, we now have complete control over where: 

     Rectangle r = new Rectangle(ClientRectangle.Left + Margin.Left, 
      ClientRectangle.Top + Margin.Top, 
      ClientRectangle.Width - Margin.Left - Margin.Right, 
      ClientRectangle.Height - Margin.Top - Margin.Bottom); 

     const int gapInLine = 2; 
     const int textMarginLeft = 7, textMarginTop = 2; 

     // Top line: 
     e.Graphics.DrawLine(linePen, r.Left, r.Top, r.Left + textMarginLeft - gapInLine, r.Top); 
     e.Graphics.DrawLine(linePen, r.Left + textMarginLeft + sizeOfText.Width, r.Top, r.Right, r.Top); 
     // and so on... 

     // Now, draw the string at the desired location:    
     e.Graphics.DrawString(Text, Font, Brushes.Black, new Point(this.ClientRectangle.Left + textMarginLeft, this.ClientRectangle.Top - textMarginTop)); 
    } 
} 

你會發現,控制不畫本身了,你負責的全過程。這可以讓你確切地知道文本的繪製位置 - 你正在繪製它。

(另請注意,該行是字符串的高度的1/10。)

+0

感謝這應該工作一種享受! – ClarkeyBoy 2010-10-30 09:19:11

0

嗯,我現在已經找到了如何讓一段文字的長度......我用下面的:

SizeF textsize = gfx.MeasureString(gb.Text, gb.Font); 

其中GFX圖形是gb是GroupBox。不過,我認爲這可能是值得的,只需編寫自己的自定義類繼承面板,添加一個標籤,然後我將能夠告訴它放置標籤1,5,10,200,254等像素。甚至百分比。我還發現,我無法重寫標準邊框 - 它仍然通過我添加的邊框顯示,如果我的邊框是1px - 使用GroupBox的另一個缺點。

問候,

理查德