在类中创建图形方法

本文关键字:图形 方法 创建 | 更新日期: 2023-09-27 17:50:08

好的,我在c#中创建一个类。它工作得很好,所以我添加了更多的方法。这意味着将一些BASIC命令作为方法移植到c#中。我想创建一个方法,可以自动绘制图形,而无需手动设置笔、点、图形等。只要输入一个命令。问题是……嗯……这行不通。当我编译时,它运行,但是当我调用方法(Object reference not set to an instance of an object)时,它抛出一个异常。我知道异常告诉我什么,但我不知道如何修复它。下面是我当前的代码:

    Graphics g;
    public void gpset(int x1, int y1, string colour1)
    {
        Pen myPen = new Pen(Color.FromName(colour1));
        g.DrawLine(myPen, x1, y1, x1 + 1, y1 + 1);
        myPen = new Pen(Color.White);
        g.DrawLine(myPen, x1 + 1, y1, x1 + 1, y1 + 1);
        myPen.Dispose();
        g.Dispose();
    }
    public void gline(int x1, int y1, int x2, int y2, string colour1)
    {
        Pen myPen = new Pen(Color.FromName(colour1));
        g.DrawLine(myPen, x1, y1, x2, y2);
        myPen.Dispose();
        g.Dispose();
    }
    public void gbox(int x1, int y1, int x2, int y2, string colour1)
    {
        Pen myPen = new Pen(Color.FromName(colour1));
        g.DrawRectangle(myPen, x1, y1, x2, y2);
        myPen.Dispose();
        g.Dispose();
    }

由于这不起作用,我尝试这样做,而不是Graphics g;

    PaintEventArgs e;
    Graphics g = e.Graphics();

现在它根本无法编译。上面写着A field initializer cannot reference the non-static field, method, or property 'SmileB.SmileB.e'

我也试过:

    PaintEventArgs e;
    //Later in the code:
    method stuff here()
    {
        other stuff here;
        e.Graphics.<command>;
    }

但这似乎也不起作用。帮助吗?这可能吗?此外,我直接在表单应用程序中运行这些方法,它们工作,所以方法本身似乎不是问题。

编辑:此外,是否有更好的方法来做gpset方法?它应该只创建一个像素的颜色。

编辑编辑:这是我如何声明类:

    using SmileB;
    namespace Drawing_Test
    {
        public partial class Form1 : Form
        {
            SmileB.SmileB ptc = new SmileB.SmileB();
            //Down here is where I use the code
        }
    }

在类中创建图形方法

似乎没有定义e。看起来您正在尝试使用PaintEventArgs对象(通常称为e)来访问Grahpics对象。您需要重载OnPaint来获得这个事件对象。你不能简单地自己制作。

同样,Graphics对象在绘制事件之后被处理,您不应该持有它。只能在OnPaint事件范围内本地使用。

编辑你问我细节。关键是,你不应该制作自己的PaintEventArgs,也不应该制作自己的Graphics。您应该钩入OnPaint来获取这些对象。

public partial class SomeForm : Form
{
  protected override void OnPaint(PaintEventArgs e)
  {
    Graphics g = e.Graphics;
    // some code to define x1, y1, colors, etc
    gpset(g, x1, y1, color1);
    gline(g, x1, y1, x2, y2, color1);
    gbox(g, x1, y1, x2, y2, color1);
  }
  public void gpset(Graphics g, int x1, int y1, string colour1)
  {
    Pen myPen = new Pen(Color.FromName(colour1));
    g.DrawLine(myPen, x1, y1, x1 + 1, y1 + 1);
    myPen = new Pen(Color.White);
    g.DrawLine(myPen, x1 + 1, y1, x1 + 1, y1 + 1);
    myPen.Dispose();
    g.Dispose();
  }
  public void gline(Graphics g, int x1, int y1, int x2, int y2, string colour1)
  {
    Pen myPen = new Pen(Color.FromName(colour1));
    g.DrawLine(myPen, x1, y1, x2, y2);
    myPen.Dispose();
    g.Dispose();
  }
  public void gbox(Graphics g, int x1, int y1, int x2, int y2, string colour1)
  {
    Pen myPen = new Pen(Color.FromName(colour1));
    g.DrawRectangle(myPen, x1, y1, x2, y2);
    myPen.Dispose();
    g.Dispose();
  }
}

如果您需要从另一个对象而不是在绘制事件中执行此操作,请阅读"创建图形对象"。

如果你在绘制事件期间从另一个对象创建这个绘制方法,只需将从它的PaintEventArgs获得的Grahpics传递给这些方法。