好的,所以我在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
}
}
答案 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
传递给这些方法。