【问题标题】:How are the painting of invisible controls handled in WinForms?WinForms中如何处理不可见控件的绘制?
【发布时间】:2012-11-27 13:05:12
【问题描述】:

我正在尝试覆盖 .NET Compact Framework 中 windows 窗体的 OnPaint 事件。

到目前为止,我能够绘制带有渐变、圆角矩形等的控件,而这些控件通常是常规控件无法实现的。

但是,当我想让控件不可见时,我遇到了问题。现在,我所做的是重新绘制除那些不可见的控件之外的所有控件。由于需要一些时间,因此会导致一些闪烁。

有谁知道窗口如何处理绘制“不可见”控件?或者你能建议任何关于如何实现这一目标的算法或方法。

【问题讨论】:

    标签: c# .net windows embedded compact-framework


    【解决方案1】:

    你应该做几件事。

    1. 不要对OnPaint 中交给您的 Graphics 对象进行绘制。绘制到后台缓冲区,然后将其绘制到最后的 Graphics。
    2. 覆盖 OnPaintBackground 并让它什么都不做。
    3. 尽可能只使发生变化的区域无效,而不是整个屏幕,以保持剪切区域较小

    如果您将单个控件更改为“不可见”,那么您将对其进行更改并使它的边界矩形无效。在OnPaint 中,您将进行绘图,省略基于 Visibility 属性的“不可见”控件。只有剪辑区域会得到更新。您甚至可以通过检查OnPaint 上的传入剪辑区域来更进一步,并且只需费心绘制该区域的绘制逻辑即可。不过这有点复杂,而且通常不是必需的。

    【讨论】:

    • 他是否必须使“不可见”控件或它所在的容器后面的任何控件无效,以使它们重新绘制,以免出现漏洞?
    • 当你使区域无效时, OnPaint 被调用并告诉你剪切区域。您将在该区域进行绘制(或绘制整个表单,并且操作系统会忽略该区域以外的所有内容)。所以你必须在那里画 something,是的(或者让基础 OnPaintBackground 处理它)。
    • 感谢您的回答。到目前为止,它工作正常。当覆盖 OnPaintBackground 事件并让它什么都不做时,闪烁消失了。但是现在我遇到了一个新问题,您如何实际删除圆角矩形中的“角”?以前,它看起来可以工作,因为背景颜色是白色的。但是当我改变表单本身的背景颜色时,角落是可见的。
    • 看看SetColorKey和色键透明度
    【解决方案2】:

    作为替代方案,是否可以在适当的控件上调用 Invalidate() 方法的任何重载以减少需要重新绘制的控件总数?

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多