自定义控件的onPaint事件无法工作

3

大家好,我遇到了一个问题。我正在编写一个自定义控件,该控件继承自Windows.Forms.Control,并尝试重写OnPaint方法。问题有点奇怪,因为它只在我的表单中包含一个控件时才能工作,如果我添加另一个控件,则第二个控件不会被绘制,但是对于所有控件都会调用OnPaint方法。所以我想要的是让所有的自定义控件都被绘制,而不仅仅是一个。以下是我的代码:

如果您运行代码,您会发现屏幕上只有一个红色矩形。

public partial class Form1 : Form
{
    myControl one = new myControl(0, 0);
    myControl two = new myControl(100, 0);

    public Form1()
    {
        InitializeComponent();
        Controls.Add(one);
        Controls.Add(two);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
}


public class myControl:Control
{
    public myControl(int x, int y)
    {
        Location = new Point(x, y);
        Size = new Size(100, 20);
    }

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

        Pen myPen = new Pen(Color.Red);
        e.Graphics.DrawRectangle(myPen, new Rectangle(Location, new Size(Size.Width -         1, Size.Height - 1)));



    }


}
2个回答

2
我猜你正在寻找这样的内容:

我猜你正在寻找这样的内容:

e.Graphics.DrawRectangle(Pens.Red, new Rectangle(0, 0, 
                                                this.ClientSize.Width - 1,
                                                this.ClientSize.Height - 1));

您的图形对象用于控件内部,因此在此处使用Location并不是非常有效。坐标系从控件客户区的左上角0,0开始。
另外,您可以直接使用内置的Pens进行颜色设置,否则,如果您创建了自己的“新”笔,请确保处理它们时将其释放。

1
然后你用那个隐蔽的编辑功能打败我,加上了解释 =) - Tergiver

0

LarsTech已经回答了,但你应该明白为什么:

控件内部的所有绘图都是在一个“画布”上完成的(在Windows中称为设备上下文),其坐标是相对于自身的。左上角始终为0,0。

宽度和高度可以在ClientSize或ClientRectangle中找到。这是因为窗口(控件在Windows中是一个窗口)有两个区域:客户区域和非客户区域。对于没有边框/标题栏的控件,这些区域是相同的,但为了未来的兼容性,您总是希望在客户区域进行绘制(除非出现罕见情况,您需要绘制操作系统通常为您绘制的非客户区域)。


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