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)));



    }


}
4

2 回答 2

2

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

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

您的 Graphic 对象用于控件的内部,因此Location在这里使用并不是很有效。坐标系从控件客户区左上角的 0,0 开始。

此外,您可以只使用内置的Pens颜色,否则,如果您正在创建自己的“新”笔,请务必处理掉它们。

于 2012-05-22T21:18:08.250 回答
0

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

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

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

于 2012-05-22T21:24:25.010 回答