使用自定义 WinForms 控件,我可以更改嵌套控件停靠在其中的矩形吗?
With a custom WinForms control, can I change the rectangle that nested controls dock inside?
我正在尝试创建一个行为很像 GroupBox
的自定义控件,但具有更改边框颜色、更改组标签文本颜色和隐藏组标签的属性。该控件直接继承自 UserControl,并覆盖 On_Paint 以绘制边框矩形和表单设计者选择的任何颜色的标签。
我遇到的问题是在尝试将嵌套控件停靠在其中时。停靠时,它使用控件的整个矩形,而不是绘制的矩形。我希望它表现得像 GroupBox,其中停靠的控件被限制在控件边框内的一个较小的矩形内。
是否有 UserControl
的 属性(或者我可以继承的 Panel
)允许您设置停靠的嵌套控件停靠到的矩形?
谢谢你,礼萨。这正是我所需要的。这是我的新控件,如果有人想使用它:
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;
}
}
停靠时控制其容器的 DisplayRectangle
。
因此,您可以覆盖容器的 DisplayRectangle
属性 以自定义停靠子控件的填充区域。例如,您可以查看 GroupBox
控件的 DisplayRectangle
属性 的源代码。
此外,您可以设置 Padding
属性 而不是覆盖显示矩形。对于容器控件,Padding
属性 获取或设置它们的 DisplayRectangle
属性。
我正在尝试创建一个行为很像 GroupBox
的自定义控件,但具有更改边框颜色、更改组标签文本颜色和隐藏组标签的属性。该控件直接继承自 UserControl,并覆盖 On_Paint 以绘制边框矩形和表单设计者选择的任何颜色的标签。
我遇到的问题是在尝试将嵌套控件停靠在其中时。停靠时,它使用控件的整个矩形,而不是绘制的矩形。我希望它表现得像 GroupBox,其中停靠的控件被限制在控件边框内的一个较小的矩形内。
是否有 UserControl
的 属性(或者我可以继承的 Panel
)允许您设置停靠的嵌套控件停靠到的矩形?
谢谢你,礼萨。这正是我所需要的。这是我的新控件,如果有人想使用它:
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;
}
}
停靠时控制其容器的 DisplayRectangle
。
因此,您可以覆盖容器的 DisplayRectangle
属性 以自定义停靠子控件的填充区域。例如,您可以查看 GroupBox
控件的 DisplayRectangle
属性 的源代码。
此外,您可以设置 Padding
属性 而不是覆盖显示矩形。对于容器控件,Padding
属性 获取或设置它们的 DisplayRectangle
属性。