windows.forms.panel两次调用onPaint

时间:2011-05-15 18:38:49

标签: c# winforms panel onpaint

我有一个面板,里面有多个面板。我已在主面板中覆盖了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似乎是由子控件本身调用的。

如何防止这样做?

3 个答案:

答案 0 :(得分:1)

那是因为所有Control个对象都有自己的绘画,而Windows自动调用该方法。解决方案是完全不依赖于这种功能 - 摆脱面板,或将Visible设置为false

答案 1 :(得分:1)

为什么你在儿童控制器上调用OnPaint? Windows将自行管理绘图调用。你永远不应该直接调用它们,尤其是你从单独的绘图调用中获得的图形上下文!

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

答案 2 :(得分:0)

这是固有的行为。您只需使用private bool secondCall;种变量,只在第二次调用时进行缩放。

相关问题