2016-02-17 3 views
3

Я пытаюсь создать настраиваемый элемент управления, который ведет себя так же, как GroupBox, но со свойствами для изменения цвета рамки, изменения цвета текста метки группы и скрытия метки группы. Элемент управления наследуется непосредственно из UserControl и переопределяет On_Paint, чтобы нарисовать прямоугольник границы и метку с любым цветом, который выбирает дизайнер форм.С помощью настраиваемого элемента управления WinForms я могу изменить прямоугольник, в который встроены вложенные элементы управления?

Проблема, с которой я сталкиваюсь, заключается в попытке установить в нее встроенные элементы управления. При стыковке он использует весь прямоугольник элемента управления, а не окрашенный прямоугольник. Я бы хотел, чтобы он вел себя как GroupBox, где закрепленные элементы управления ограничены меньшим прямоугольником внутри границ элемента управления.

Есть ли свойство UserControl (или, возможно, Panel, которое я мог бы наследовать вместо), которое позволяет вам установить прямоугольник, на котором закреплены вложенные элементы управления?


спасибо, Reza. Это было именно то, что мне нужно. Вот мой новый элемент управления, если кто-то хочет использовать его:

public class LabelledPanel : Panel { 

    #region Constructors/Initializers 
    public LabelledPanel() : base() { 
     InitializeComponent(); 
    } 

    private void InitializeComponent() { 
     this.BackColor = System.Drawing.Color.Transparent; 
     this.ForeColor = System.Drawing.Color.Red; 
     this.Name = "LabelledPanel"; 
     this.ResumeLayout(false); 
     this.PerformLayout(); 
    } 
    #endregion 

    #region Private fields 
    private String text = "Label"; 
    private Brush brush; 
    private Color foreColor; 
    private Boolean showLabel = true; 
    private Int32 labelHeight = 13; 
    private Int32 pad = 3; 
    #endregion 

    #region Properties 
    [Browsable(true)] 
    [Category("Appearance")] 
    public override String Text { 
     get { return text; } 
     set { text = value; } 
    } 

    [Browsable(true)] 
    [Category("Appearance")] 
    public override Color ForeColor { 
     get { return foreColor; } 
     set { 
      foreColor = value; 
      brush = new SolidBrush(value); 
     } 
    } 

    [Browsable(true)] 
    [Category("Layout")] 
    public Boolean ShowLabel { 
     get { return showLabel; } 
     set { showLabel = value; } 
    } 

    public override Rectangle DisplayRectangle { 
     get { 
      var r = GetBorderRect(); 
      return new Rectangle(
       r.Left + pad, 
       r.Top + pad, 
       r.Width - (2 * pad), 
       r.Height - (2 * pad)); 
     } 
    }   
    #endregion 

    protected override void OnPaint(PaintEventArgs p) {    
     base.OnPaint(p); 
     ControlPaint.DrawBorder(p.Graphics, GetBorderRect(), foreColor, ButtonBorderStyle.Solid);   
     if (showLabel) 
      p.Graphics.DrawString(Text, Font, brush, 0, 0); 
    } 

    private Rectangle GetBorderRect() { 
     Rectangle r = this.ClientRectangle; 
     if (showLabel) { 
      r.Height -= labelHeight; 
      r.Y += labelHeight; 
     } 
     return r; 
    } 
} 
+0

Кстати, лучше не оставлять ответ как часть вашего вопроса. Это может ввести в заблуждение будущих читателей. Вы можете опубликовать отредактированную часть в качестве ответа. –

ответ

1

управления по отношению к DisplayRectangle их емкости при швартовке.
Таким образом, вы можете переопределить свойство контейнера для настройки заполненной области с помощью закрепленных дочерних элементов управления. В качестве примера вы можете посмотреть исходный код DisplayRectangle property of GroupBox control.

Также вместо переопределения прямоугольника дисплея вы можете установить свойство Padding. Для управления контейнером свойство Padding получает или устанавливает свои свойства DisplayRectangle.

Смежные вопросы