C# 自定义控件onPaint事件不工作

C# 自定义控件onPaint事件不工作,c#,custom-controls,onpaint,C#,Custom Controls,Onpaint,大家好,我有个问题,我正在写一个自定义控件。我的控件继承自Windows.Forms.control,我正在尝试重写OnPaint方法。这个问题有点奇怪,因为它只有在我的表单中包含一个控件时才起作用。如果我添加了另一个控件,那么第二个控件不会得到draw,但是所有控件都会调用OnPaint方法。所以我想要的是,我所有的自定义控件都得到绘制,而不仅仅是一个,这是我的代码: 如果运行代码,您将看到屏幕中只显示一个红色矩形 public partial class Form1 : Form {

大家好,我有个问题,我正在写一个自定义控件。我的控件继承自Windows.Forms.control,我正在尝试重写OnPaint方法。这个问题有点奇怪,因为它只有在我的表单中包含一个控件时才起作用。如果我添加了另一个控件,那么第二个控件不会得到draw,但是所有控件都会调用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)));



    }


}

我猜你在找这样的东西:

e.Graphics.DrawRectangle(Pens.Red, new Rectangle(0, 0, 
                                                this.ClientSize.Width - 1,
                                                this.ClientSize.Height - 1));
图形对象位于控件内部,因此使用
Location
在这里并不真正有效。坐标系从控件工作区左上角的0,0开始


此外,您只需使用内置的
进行颜色处理,否则,如果您正在创建自己的“新”笔,请务必将其丢弃。

LarsTech抢先一步,但您应该了解原因:

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


宽度和高度可在ClientSize或ClientRectangle中找到。这是因为窗口(控件是Windows中的窗口)有两个区域:客户端区域和非客户端区域。对于您的无边界/无标题控件,这些区域是一个相同的区域,但对于未来的校对,您总是希望在客户端区域进行绘制(除非在罕见的情况下,您希望绘制操作系统通常为您绘制的非客户端位)。

然后,您通过隐藏编辑击败了我,添加了一个解释=)