【发布时间】:2015-06-25 03:46:16
【问题描述】:
我有一个 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 事件才能使我的解决方案发挥作用?
我还认为我可以创建一种新的表单类型,继承默认表单,在该表单中添加 _paint 事件并将我所有的表单定义为这种类型。哪种方法最好?
我的最后一个问题是:当我多次调用我的函数时,我真正要做的就是在前一个矩形之上绘制一个新矩形。我应该使用
this.Invalidate();
在更改边框颜色之前?
【问题讨论】:
-
我只是在阅读您的问题的一半,但在这种情况下您不应该使用 CreateGraphics。您在 Paint 事件处理程序中获得的 PaintEventArgs 具有您应该使用的
Graphics属性(因此您必须将e.Graphics传递给您的drawBorder方法)。这允许 .NET 为您管理诸如双缓冲之类的事情。 -
我会将颜色放在表单级别的属性中,并在每次更改时调用 set{} 中的 this.Invalidate()。
标签: c# winforms system.drawing