在整个应用程序中提供自定义绘图方法

时间:2012-04-25 11:05:08

标签: c# winforms

我在我的一个申请表单中为标签添加了自定义边框,如下所示:

    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事件'。

如何在整个应用程序中使用此方法?

2 个答案:

答案 0 :(得分:3)

创建类LabelWithBorderLabel派生,覆盖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);
}