2

私のアプリケーションは、フォームをメイン フォームの子としてポップします。フォームには
、グラフィックスがレンダリングされるパネルを備えたユーザー コントロールがあります。デバッグ モードで Visual Studio から実行すると、多くの場合、描画は期待どおりにレンダリングされます。単純な XY グラフを想像してください。パネルのグラフィックが描画されない場合は、通常、描画ルーチンに 2 つまたは 3 つのブレーク ポイントを追加すると問題が解決します。

リリース モードで Visual Studio 内で実行した場合、または任意のモードで .exe から実行した場合、ユーザー コントロールの Paint メソッドが呼び出されても、グラフィックはレンダリングされません。もちろん、フォームのサイズを変更すると、再描画が再度呼び出され、画像が正しくレンダリングされるようになりました。

デバッグ モードとリリース モードの間で動作に違いがある理由、VS 内での実行と VS の外側での実行、ブレーク ポイントが時々問題を修正する理由について、誰かが私に洞察を与えることができますか? また、グラフィックを一貫して表示するにはどうすればよいですか。

ありがとう、

リック

代替テキスト http://img160.imageshack.us/my.php?image=profilebeforeresizeti4.png代替テキスト http://img512.imageshack.us/my.php?image=profileafterresizenw2.png

4

2 に答える 2

1

これを試してみたところ、リリースモードで期待どおりの動作をしました。. . パネルを青色と大きな黄色の楕円で塗りつぶします。問題を再現するために必要な最小限のサンプル コードを投稿してください。. . おそらく、以下の MyPanel から構築されています。

タイマーの役割は、頻繁に再描画しないようにすることです。これは、コントロール全体の再描画を強制する自己終了タイマーです。これは、カスタム描画コンテンツがコントロールに合わせてサイズ変更されるために必要です。

   public class MyPanel : Panel
    {
        Timer _resizeRedrawDelayTimer = new Timer();
        public MyPanel()
        {
            _resizeRedrawDelayTimer.Interval=50;
            _resizeRedrawDelayTimer.Tick += new EventHandler(_resizeRedrawDelayTimer_Tick);
        }

        void _resizeRedrawDelayTimer_Tick(object sender, EventArgs e)
        {
            Invalidate();
            _resizeRedrawDelayTimer.Stop();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            // don't redraw if still resizing.
            if (!_resizeRedrawDelayTimer.Enabled)
            {
                e.Graphics.FillRectangle(Brushes.Blue, this.ClientRectangle);
                e.Graphics.FillEllipse(Brushes.Yellow, this.ClientRectangle);
            }
            base.OnPaint(e);
        }

        protected override void OnResize(EventArgs eventargs)
        {
            if (_resizeRedrawDelayTimer.Enabled)
                _resizeRedrawDelayTimer.Stop();
            // restart the timer.
            _resizeRedrawDelayTimer.Start();
            base.OnResize(eventargs);
        }
    }
于 2009-11-25T06:03:47.650 に答える
1

これ以上の情報がなければ、動作の違いが見られる理由を確実に言うことはできません (デバッグ バージョンも常に機能するとは限らないことを認めているため、同じ問題が発生していることをお勧めします)。多くの場合、ペイントの問題を "修正" します。これは、Visual Studio に戻すと、ごく一部ではなく、ペイント サーフェス全体が無効になるためです。したがって、アプリケーションを起動しても正しく描画されない場合、Visual Studio でブレークポイントにヒットし、いくつかの変数を見て切り替え、アプリケーションに戻り、正しく描画されます。これは、OnPaint が適切なクリッピング四角形で呼び出されて表面全体が再描画されたためです。 (また、通常は OnPaintBackground も呼び出されます。以下を参照してください)。

この場合、アプリケーションを最小化して復元することで、リリース バージョンで複製できるはずです。これでコントロールの表示が「修正」される場合は、ペイント メソッドがコントロール全体をペイントしていないのにペイントしていると仮定して、ペイント メソッドの問題が原因である可能性があります。

また、PaintBackground を調べて、コントロールのサーフェスを適切に消去していることを確認することもできます。「新しい」キャンバスから始めるのではなく、古いディスプレイを残し、その上に再ペイントしている可能性があります。

何が起こっているかについての説明と、それを再描画する方法に基づいて、これらが私の最良の提案です. より正確なヘルプを提供するには、より具体的な詳細 (ペイント コード、何が起こるかについての具体的な説明 - コントロールが描画されないか、パーツのみを表示するかなど) が必要です。

于 2008-11-14T06:49:57.890 に答える