0

我有一个面板,里面有多个面板。我已将主面板中的 OnPaint 覆盖为以下内容:

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics graph = e.Graphics;
        graph.Clear(Color.Black);
        InvokePaintBackground(this, e);

        graph.ScaleTransform(scale, scale);

        foreach (childPanel child in childPanels)
        {
            child.onPaint(this, e);
        }

        graph.ResetTransform();
    }

我遇到的问题是第一个控件(点 0 中的控件)的 onPaint 函数被调用了两次,所以我得到了两个版本的子面板,一个有缩放,一个没有。第二个 onPaint 似乎是由子控件本身调用的。

我怎样才能让它不这样做?

4

3 回答 3

1

你到底为什么要在子控件上调用 OnPaint?Windows 将自行管理绘制调用。您永远不应该直接调用它们,尤其是使用从单独的绘制调用中收到的图形上下文!

如果您需要请求绘制子控件,请改用Invalidate方法。它将一个区域(或整个控件)标记为无效,以便 Windows 将其绘制。这样做的好处是 Windows 足够聪明,知道如果您在同一个绘制周期中多次使其无效,它不会重新绘制多次。

于 2011-05-15T18:45:24.110 回答
1

这是因为所有Control对象都进行自己的绘制,并且该方法由 Windows 自动调用。解决方案是完全不依赖这种功能 - 摆脱面板,或设置Visiblefalse.

于 2011-05-15T18:42:47.707 回答
0

这是固有的行为。您可以简单地使用private bool secondCall;某种变量并仅在第二次调用时进行缩放。

于 2011-05-15T18:45:32.023 回答