子父控件中的绘制顺序(OnPaint / OnPaintBackground事件)是什么?

时间:2008-12-19 03:15:23

标签: c# .net user-interface

使用C#.NET Compact Framework我正在创建一个GUI控件,它包含和控制也是自定义控件的子项(即System.Windows.Forms.UserControl)。子元素和父元素都有自定义绘图例程(OnPaint)。为了更好地理解和优化绘图程序,我想澄清.NET下的绘图顺序。

(1)当第一次显示整个事物时,以下事件的正确顺序是什么:

  • parent.OnPaintBackground

  • child.OnPaintBackground

  • parent.OnPaint

  • child.OnPaint

(2)Control.Invalidate()调用的顺序是否会影响OnPaint / OnPaintBackground事件的顺序?

(3)如果子控件调用自己的child.Invalidate(),父也会得到OnPaint / OnPaintBackground事件吗?

(4)系统如何确定哪个控件是哪个控件是父项,反之亦然? Control.Parent是这种关系的唯一标志吗?

1 个答案:

答案 0 :(得分:1)

这不是一个真正的答案,但您可以使用一些Debug.Print()语句并编写一个快速程序来自己测试1-3。将订阅者添加到您感兴趣的事件中,并查看它们何时发生。然后按照2-3中的建议执行操作,并更改Invalidate()次调用的顺序并观察。

就像我说的那样,不是答案,但肯定是一种发现答案的方法。

至于#4,就像你暗示的那样,这种关系是双向的。您已经与Control.Parent(child-> parent)保持一半关系。另一半是Control.Controls集合(parent-> children)。根据我的理解,将这种关系视为一个无序的大树。