【问题标题】:Custom control onPaint event not working自定义控件 onPaint 事件不起作用
【发布时间】:2012-05-22 21:12:20
【问题描述】:

大家好,我在编写自定义控件时遇到问题。我的控件继承自 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)));



    }


}

【问题讨论】:

    标签: c# custom-controls onpaint


    【解决方案1】:

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

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

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

    此外,您可以只使用内置的Pens 来获取颜色,否则,如果您要创建自己的“新”笔,请务必将它们丢弃。

    【讨论】:

    • 然后你用那个秘密编辑打败了我,添加了一个解释 =)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      相关资源
      最近更新 更多