自定义控件onPaint事件不起作用

时间:2012-05-22 21:12:21

标签: c# custom-controls onpaint

嘿,我有问题我正在编写自定义控件。我的控件继承自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 个答案:

答案 0 :(得分:2)

我猜你正在寻找这样的东西:

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

您的图形对象适用于您的控件内部,因此使用Location并非如此有效。坐标系从控件客户区左上角的0,0开始。

此外,您可以使用内置Pens颜色,否则,如果您正在创建自己的"新"笔,一定要丢弃它们。

答案 1 :(得分:0)

LarsTech打败了我,但你应该明白为什么:

控件内的所有绘图都是针对“画布”(在Windows中正确称为设备上下文),其坐标是自相关的。左上角始终为0,0。

宽度和高度可在ClientSize或ClientRectangle中找到。这是因为窗口(控件是Windows中的窗口)有两个区域:客户区和非客户区。对于无边框/无标题栏控件,这些区域是同一个区域,但为了面向未来,您总是希望在客户区绘制(除非罕见的情况发生在您想要绘制操作系统通常描绘的非客户端位的位置)为你)。