2012-05-22 42 views
3

嘿,人们我有一个问题我正在写一个自定义控件。我的控制继承自Windows.Forms.Control,我试图重写OnPaint方法。这个问题有点奇怪,因为它只有在我的表单中包含一个控件时才起作用,如果我添加另一个控件,那么第二个控件不会绘制,但是所有控件都会调用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

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

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

您的图形对象是你无法控制的内部,因此使用Location是不是真的有效这里。坐标系统从控件客户区左上角的0,0开始。

此外,您可以使用内置的Pens来获取颜色,否则,如果您要创建自己的“新”笔,请务必将其处理掉。

+1

然后你用那个隐形编辑打我,加个解释=) – Tergiver

+0

很好,谢谢你们 –

0

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

所有控制的内部描绘是为了谁坐标为自相关的一个“画布”(正确称为Windows中的设备上下文)制成。左上角总是0,0。

宽度和高度可在ClientSize或ClientRectangle中找到。这是因为一个窗口(一个控件是Windows中的一个窗口),有两个区域:客户区和非客户区。对于无边界/无标题栏控件,这些区域是相同的,但为了将来打样,您总是需要在客户区域进行绘制(除非偶尔出现要绘制操作系统通常绘制的非客户端位的情况为你)。