【问题标题】:C# How do I draw a line between two objects on a windows form?C#如何在windows窗体上的两个对象之间画一条线?
【发布时间】:2017-11-12 12:50:23
【问题描述】:

我很长时间以来一直试图在两个对象之间画一条线,但它仍然不起作用。

我的程序应该制作两个图片框(已经制作,分别称为 PB1 和 PB2),并用表格上的一条线将它们连接起来。

我有这个:

public void DrawStuff(object sender, PaintEventArgs e)
    {
        Pen blackPen = new Pen(Color.Black, 3);
        Point point1 = new Point(PB[0].Location.X, PB[0].Location.Y);
        Point point2 = new Point(PB[1].Location.X, PB[1].Location.Y);

        e.Graphics.DrawLine(blackPen, point1, point2);
        CreateGraphics();
    }

但是我不能调用这个函数!另外,盒子是用一个按钮创建的,所以它不能从一开始就画,它必须在我按下那个按钮后才画。如果有人有工作代码,请告诉我,我快崩溃了。

【问题讨论】:

  • 抽奖事件是否已连接?我猜不是,否则如果尚未创建这些 PictureBox,您将在这些 PictureBox 上看到空异常。请改用 OnPaint 覆盖。在访问 PB[0] 和 PB[1] 之前,请确保它们存在。您没有向我们提供有关如何创建这些框的代码。消除 CreateGraphics();行——它没有为你做任何事情。

标签: c# winforms draw


【解决方案1】:
  1. 不要(永远不要)显式调用CreateGraphics()。这是危害人类罪,极少数情况除外。
  2. 处理您的FormPaint 事件(或覆盖OnPaint())。在那里写下你的画线代码。

类似这样的:

protected override void OnPaint(PaintEventArgs e)
{
  base.OnPaint(e);

  using(var blackPen = new Pen(Color.Black, 3))
    e.Graphics.DrawLine(blackPen, PB[0].Location, PB[1].Location);
}
  1. 当您需要手动刷新屏幕时,请致电this.Invalidate()

【讨论】:

  • 仍有一些东西不工作。它说在覆盖受保护的成员时它不能更改访问修饰符。是的,我尝试将其设置为公开。
  • @ExoSkull:按照要求将其设置为受保护。我的错误也是。更新了我的代码。
  • 好的,我更进一步,但这一次它崩溃了,甚至没有绘制其他对象。按钮必须首先创建 PictureBoxes,因此它会尝试在甚至还不存在的框之间进行绘制...
  • @ExoSkull:您可以通过声明最初设置为 false 的全局 bool 标志轻松解决此问题。然后在创建图片框或其他内容后将其设置为true。在OnPaint()事件中,在执行画线之前检查这个标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多