Я пытаюсь создать настраиваемый элемент управления, который ведет себя так же, как 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;
}
}
Кстати, лучше не оставлять ответ как часть вашего вопроса. Это может ввести в заблуждение будущих читателей. Вы можете опубликовать отредактированную часть в качестве ответа. –