自定义控件 OnPaint 事件未触发。

3
我有以下自定义的控件::
public class Line : Control
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        using (var p = new Pen(Color.Black, 3))
        {
            var point1 = new Point(234, 118);
            var point2 = new Point(293, 228);
            e.Graphics.DrawLine(p, point1, point2);
        }
    }
}

我创建了一个 Form,并在其中添加了一个新的 Line 类控件实例:

Controls.Add(new Line());

问题在于OnPaint方法没有被调用,因此没有绘制任何线条。为什么会这样?我该如何解决?
1个回答

3

您没有给它一个尺寸,请尝试创建一个构造函数并在那里设置默认大小,您似乎还在使用父控件的坐标,建议使用用户控件的位置来设置起始位置,并且只关注需要包含您的线条的控件的宽度和高度。

public  Line()
{
     Size = new Size(500, 500);
}

1
它能工作,但我有一个奇怪的问题...我可以画一条线:如果我添加另一个控件,它就不会画出来...我只是添加了另一个Controls.Add(new Line());指令(在第一个之后)。你知道为什么吗? - Nick
可能会被放置在同一位置,你正在创建一个拥有正方形区域的控件,根据第二个控件的坐标,它可能会被覆盖。 - Mark Hall
好的,但是假设我必须画两条线来显示字符 X,我的两个控件都具有相同的 Size(例如50x50)和相同的位置(只有两条线具有不同的坐标)。如何在不覆盖另一条线的情况下显示第二条线? - Nick
1
这是使用winforms的一个缺点,您无法获得真正的透明度。您最好在同一控件上绘制x,在容器上进行绘制,或安装Visual Basic PowerPack并使用LineShape。 - Mark Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接