0

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

    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() 方法放在一个类中,以便以这种方式从多种表单中调用它,但它不起作用,说“基础没有 OnPaint 事件”。

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

4

2 回答 2

3

创建类LabelWithBorder派生它Label,重写OnPaint 方法

public class LabelWithBorder : Label {
  protected override void OnPaint(PaintEventArgs e) {
    ColorMe(e);
  }
}

将应用中的所有 WinForms 标签替换为您的标签。

于 2012-04-25T11:11:26.917 回答
1

You probably shouldn't use the ClipRectangle for drawing in this case, since it would produce malformed rectangles on your control.

If not using Karel Frajtak's solution, which is cleaner, you can try making a static class and then you can call it from any form:

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);
  }
}

Example:

public Form1() {
  InitializeComponent();
  label1.Paint += label_Painter;
  label2.Paint += label_Painter;
}

void label_Painter(object sender, PaintEventArgs e) {
  LabelBorder.ColorMe(((Label)sender).ClientRectangle, e);
}
于 2012-04-25T11:48:25.823 回答