在类中创建图形方法?

时间:2014-03-12 21:17:32

标签: c# class graphics

好的,所以我在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
        }
    }

1 个答案:

答案 0 :(得分:1)

似乎永远不会定义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();
  }

}

如果您需要在其他对象中执行此操作,而不是在绘画活动期间,请阅读Creating a Graphics object

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