【问题标题】:c# draw rectangle in every formc# 以各种形式绘制矩形
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我建议你用protected override OnPaint() 创建一个BaseForm

    并且每当您创建新的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();
        }
    }
    

    【讨论】:

    • 如果您要在OnPaint 覆盖中调用DrawBorder,则将图形实例从PaintEventArgs 传递给DrawBorder。调用CreateGraphics 通常被认为是不好的。
    • @ChrisDunaway - 是的,我知道,我复制粘贴了OP's 代码!
    猜你喜欢
    • 2013-08-02
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多