我在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();
在更改边框颜色之前?
答案 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)
基本表单是一种可靠的方法 - 当您想要更改颜色时,添加一个静态方法来触发静态事件。
让您的基本表单处理该事件并强制重新绘制,并且您应该有一个点可以从所有矩形可以更改的位置。