c#在每种形式中绘制矩形

时间:2015-06-24 19:33:00

标签: c# winforms system.drawing

我在c#中有一个包含多种表单的项目。想象一下这种情况:

每个表单中都有一个(比如说绿色)矩形。当我调用一个函数时,我需要每个矩形来改变它的颜色(变成红色)。我创建了这个函数来绘制一个矩形:

private void drawBorder(System.Drawing.Color c)
{
    System.Drawing.Graphics g = this.CreateGraphics();
    System.Drawing.Brush br = new System.Drawing.SolidBrush(c);
    System.Drawing.Pen p = new System.Drawing.Pen(br, 4);

    System.Drawing.Rectangle r = new Rectangle(0, 0, 50, 50);
    g.DrawRectangle(p, r);
    g.Dispose();
    br.Dispose();
    p.Dispose();
}

我已经意识到我无法在加载时调用此函数(这是真的吗?)这只是我需要回答的第一个问题

所以,如果我只有一个表单,我首先会在paint上调用这个函数:

private void fLogin_Paint(object sender, PaintEventArgs e)
{
    drawBorder(System.Drawing.Color.Red);
}

然后每当我需要时(例如按下按钮)再次调用它,并使用不同的颜色参数。这适用于我的单一表格。但我需要各种形式。

所以我的第二个问题是我是否需要在每个表单中创建一个_paint事件才能使我的解决方案正常工作?

我还认为我可以创建一种新类型的Form,继承默认表单,在该表单中添加_paint事件并将所有表单定义为此类型。哪种方法最好?

我的最后一个问题是:当我多次调用我的函数时,我真正做的是在前一个上面绘制一个新的矩形。我应该使用

this.Invalidate();

在更改边框颜色之前?

2 个答案:

答案 0 :(得分:1)

我建议您使用BaseForm创建protected override OnPaint()

每当您创建新的Form时,都会继承BaseForm而不是默认的Form

以下是BaseForm

的操作方法
public class BaseForm : Form
{
    protected void DrawBorder(Color c)
    {
        var g = CreateGraphics();
        var br = new SolidBrush(c);
        var p = new Pen(br, 4);

        var r = new Rectangle(0, 0, 50, 50);
        g.DrawRectangle(p, r);

        p.Dispose();
        br.Dispose();
        g.Dispose();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        DrawBorder(Color.Red);
        base.OnPaint(e);
    }
}

如何将其应用于新创建的表单

public partial class Form1 : BaseForm // Use the BaseForm instead of default 'Form'
{
    public Form1()
    {
        InitializeComponent();
    }
}

答案 1 :(得分:1)

基本表单是一种可靠的方法 - 当您想要更改颜色时,添加一个静态方法来触发静态事件。

让您的基本表单处理该事件并强制重新绘制,并且您应该有一个点可以从所有矩形可以更改的位置。