将PaintEventArgs传递给我的函数会导致错误
本文关键字:错误 函数 我的 PaintEventArgs | 更新日期: 2023-09-27 18:06:14
我尝试创建一个函数来绘制我的地图。我的函数是这样的:
public void DrawMap(PaintEventArgs e)
{
List<Point> lstPointLeft = new List<Point>();
foreach (var t in lstSensorLeft)
{
Point objPoint = new Point(t.XLocation, t.YLocation);
lstPointLeft.Add(objPoint);
Rectangle rectSens = new Rectangle(t.XLocation, t.YLocation, 3, 3);
e.Graphics.FillRectangle(whiteBrush, rectSens);
if (t.StationId != null)
{
Rectangle rectEhsansq = new Rectangle(t.XLocation - 6, t.YLocation - 6, 12, 12);
e.Graphics.FillRectangle(blueBrush, rectEhsansq);
}
}
List<Point> lstPointRight = new List<Point>();
foreach (var t in lstSensorRight)
{
Point objPoint = new Point(t.XLocation + 30, t.YLocation + 30);
lstPointRight.Add(objPoint);
Rectangle rectSens = new Rectangle(t.XLocation + 30, t.YLocation + 30, 3, 3);
e.Graphics.FillRectangle(whiteBrush, rectSens);
if (t.StationId != null)
{
Rectangle rectPosition = new Rectangle(t.XLocation + 24, t.YLocation + 24, 12, 12);
e.Graphics.FillRectangle(blueBrush, rectPosition);
Rectangle rectTrainState = new Rectangle(t.XLocation + 27, t.YLocation + 27, 7, 7);
e.Graphics.FillRectangle(RedBrush, rectTrainState);
}
}
e.Graphics.DrawLines(pLine, lstPointLeft.ToArray());
e.Graphics.DrawLines(pLine, lstPointRight.ToArray());
//ShowOnlineTrain(e);
//Thread newThread = new Thread(() => ShowOnlineTrain(e));
//newThread.Start();
}
这个函数绘制了我的地图,我有一个PictureBox
在我的表格中显示了我的地图。函数DrawMap
绘制了一张没有任何内容的铁路地图。我的问题是如何在page_Load
中调用这个函数?我试过这样做:
我已经创建了一个全局painteventarg:
private PaintEventArgs a;
在form_load
中,我这样做:
private void frmMain_Load(object sender, EventArgs e)
{
DrawMap(a);
}
这一行:
e.Graphics.FillRectangle(whiteBrush, rectSens);
I am getting below error:
{System.NullReferenceException: Object reference not set to an instance of an object.
at PresentationLayer.PreLayer.frmMain.DrawMap(PaintEventArgs e)
在我看来,您的DrawMap
方法应该将Graphics
对象作为参数,而不是PaintEventArgs
:
public void DrawMap(Graphics g)
{
...
g.FillRectangle(whiteBrush, rectSens);
...
}
然后你可以将你想要绘制地图的对象的图形对象传递给它。例:获取图像的图形对象
private void frmMain_Load(object sender, EventArgs e)
{
Image img = new Bitmap(100, 100);
Graphics g = Graphics.FromImage(img);
DrawMap(g);
myPictureBox.Image = img;
}
这可以在任何方法中完成,而不仅仅是在Load事件中,但请注意,您可能需要在绘制控件后刷新控件以查看任何更改。
myPictureBox.Refresh();
或者,您可以从控件获取图形对象。
Graphics g = myPictureBox.CreateGraphics()
DrawMap(g);
然而,如果你使用这个,那么你可能会有问题的控制本身重新绘制和清除你的地图(例如,当控制或窗口被另一个窗口调整大小或隐藏)。在这种情况下,最好将您的绘图放在控件的Paint事件中。