将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) 

将PaintEventArgs传递给我的函数会导致错误

在我看来,您的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事件中。