OnPaint事件订单

时间:2011-05-02 20:05:30

标签: c# .net winforms custom-controls gdi+

我使用自己的OnPaint开发了一些组件 - 覆盖我绘制的组件。

我现在添加了一个状态面板,该面板设计为与我的表单的一部分重叠。我使用alpha混合颜色灰色底层控件并在其上显示文本。

不幸的是,我的一些底层自定义控件会在状态栏后自行绘制,因此将自己绘制在状态栏上方。调试我发现首先调用paint事件的状态栏,然后调用底层控件的paint事件。

如何确保使用正确的顺序进行绘画?

当底层组件绘制自己时,它们前面的组件应该总是自动失效,因此它们会自行重绘,但这并不是很好。我还在状态栏上调用了SendToFront,但两者都没有帮助。所以我也问到维护订单的正确机制是什么以及核心组件如何处理它。

修改:我也遇到了这个问题:每次运行OnPaint - 事件时,我的叠加层变得越来越不透明,因为它使用 alpha = 128绘制 - 红色一次又一次。

1 个答案:

答案 0 :(得分:1)

为了消除外部因素(如XP,Vista,Win7之间的差异),您可以:

  • 将“状态面板”图形混合到其OnPaint处理程序中的每个控件上,因此您无需使用半透明状态窗口来实现所需的显示。

  • 使用一个不透明控件(本质上是状态面板)并通过合成来自各个控件的图形将所需的最终图像渲染到其中,这将消除渲染过程如何操作的任何不确定性。这意味着你必须添加自定义点击处理,但这通常是一个相当简单的补充 - 一个简单的方法是将主要的“显示控件”置于一组不可见的控件(按钮)后面,以便所有点击处理可以正常工作,但绘画被委托给一个控件。