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関数が2回呼び出されているため、子パネルの2つのバージョンを取得していることです。1つはスケーリングあり、もう1つはスケーリングなしです。2番目のonPaintは、子コントロール自体によって呼び出されているようです。

どうすればこれを防ぐことができますか?

4

3 に答える 3

1

これは、すべてのControlオブジェクトが独自のペイントを行い、メソッドがWindowsによって自動的に呼び出されるためです。解決策は、この種の機能にまったく依存しないことです。パネルを削除するか、に設定Visiblefalseます。

于 2011-05-15T18:42:47.707 に答える
1

いったいなぜあなたはチャイルドコントロールでOnPaintを呼んでいるのですか?Windowsは独自にペイント呼び出しを管理します。特に、別のペイント呼び出しから受け取ったグラフィックスコンテキストでは、それらを直接呼び出すことは絶対にしないでください。

子コントロールのペイントを要求する必要がある場合は、代わりにInvalidateメソッドを使用してください。領域(またはコントロール全体)を無効としてマークし、Windowsがそれをペイントするようにします。その利点は、Windowsが十分にスマートであり、同じペイントサイクルで複数回無効にした場合、複数回再描画されないことを認識していることです。

于 2011-05-15T18:45:24.110 に答える
0

それは固有の振る舞いです。private bool secondCall;ある種の変数を使用して、2番目の呼び出しでのみスケーリングを実行できます。

于 2011-05-15T18:45:32.023 に答える