我在我的一个申请表单中为标签添加了自定义边框,如下所示:
private void ColorMe(PaintEventArgs e)
{
Color myColor = Color.FromArgb(104, 195, 198);
Pen myPen = new Pen(myColor, 1);
e.Graphics.DrawRectangle(myPen,
e.ClipRectangle.Left,
e.ClipRectangle.Top,
e.ClipRectangle.Width - 1,
e.ClipRectangle.Height - 1);
base.OnPaint(e);
}
private void lblDisbs_Paint(object sender, PaintEventArgs e)
{
ColorMe(e);
}
哪个很好用。我所要做的就是将ColorMe(e)放在每个标签的Paint Event中。
但是我希望在整个应用程序的所有表单中使用此方法。我尝试将我的ColorMe()方法放在一个类中,从多个表单中调用它,但它不起作用,说'base没有OnPaint事件'。
如何在整个应用程序中使用此方法?
答案 0 :(得分:3)
创建类LabelWithBorder
从Label
派生,覆盖OnPaint
method。
public class LabelWithBorder : Label {
protected override void OnPaint(PaintEventArgs e) {
ColorMe(e);
}
}
将您的应用中的所有WinForms标签替换为您的标签。
答案 1 :(得分:1)
在这种情况下,您可能不应该使用ClipRectangle
绘图,因为它会在您的控件上产生格式错误的矩形。
如果没有使用更干净的Karel Frajtak解决方案,你可以尝试制作静态类,然后你可以从任何形式调用它:
internal static class LabelBorder {
public static void ColorMe(Rectangle r, PaintEventArgs e) {
r.Inflate(-1, -1);
using (Pen p = new Pen(Color.FromArgb(104, 195, 198), 1))
e.Graphics.DrawRectangle(p, r);
}
}
示例:
public Form1() {
InitializeComponent();
label1.Paint += label_Painter;
label2.Paint += label_Painter;
}
void label_Painter(object sender, PaintEventArgs e) {
LabelBorder.ColorMe(((Label)sender).ClientRectangle, e);
}