在类中创建图形方法
本文关键字:图形 方法 创建 | 更新日期: 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
传递给这些方法。