0

次のように、申請書の1つでラベルにカスタム境界線を追加しました。

    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)を各ラベルのペイントイベントに配置するだけです。

ただし、アプリケーション全体のすべてのフォームでこのメソッドを使用したいと思います。ColorMe()メソッドをクラスに入れて、複数のフォームからそのように呼び出すことを試みましたが、「baseには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

ClipRectangleコントロールに不正な四角形が生成されるため、この場合は for drawing を使用しないでください。

よりクリーンな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);
}
于 2012-04-25T11:48:25.823 に答える