2011-03-01 16 views
0

私は、OnPaintイベントをオーバーライドして500ポイントのグラフを描画するInherited Panelコンポーネントを持っています。私はグラフ上でいくつかの選択をする必要があるので、それはちらついている。このDoubleBufferedプロパティが見つかりましたが、PanelコンストラクタでTrueに設定すると、描画が消えます。私はそれをデバッグし、描画メソッドはまだ実行するが、パネル上には何もないことがわかります。 誰もがなぜこれが起こるのか知っていますか?Panel DoubleBufferedプロパティが描画を停止し、不可視です

これは.NET 3.5 - C#です。リサイズアプリケーション

 try 
     { 
      Graphics g = e.Graphics; 

      //Draw _graphArea: 
      g.DrawRectangle(Pens.Black, _graphArea); 

      _drawingObjectList.DrawGraph(g, _mainLinePen, _diffLinePen, _dotPen, _dotBrush, _notSelectedBrush, _selectedBrush); 

      DrawSelectionRectangle(g); 

      g.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

パネルの子孫のコンストラクタ:

 this.BackColor = Color.White; 
     this.SetStyle(ControlStyles.ResizeRedraw, true); 
     this.SetStyle(ControlStyles.UserPaint, true); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     this.UpdateStyles(); 
+0

これは.Netと思われますか?言語? – rene

+0

@reneはい、そうです。ごめんなさい。 C#。それは今問題になっている。 – elector

+0

あなたの描画コードを教えてもらえますか? – FreeAsInBeer

答えて

1

代わりControlStyles.OptimizedDoubleBufferedを使用してみてください。それは速く、通常はより良く機能します。 ControlStyles.AllPaintingInWmPaintControlStyles.UserPaintも有効になっていることを確認してください。

今、OnPaint()はウィンドウに描画する唯一のものでなければならず、このメソッドは無効化またはRefresh()を使用して呼び出す必要があります。 OnPaint()には絶対に電話をかけてはいけません。 Graphicsオブジェクトを廃棄しないでください。これらの条件に失敗すると、ちらつきやその他のさまざまな描画バグが発生する可能性があります。

class MyControl : UserControl 
{ 
    public MyControl() 
    { 
     SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     SetStyle(ControlStyles.UserPaint, true); 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.Clear(Color.Red); 
    } 

    void RandomEventThatRequiresRefresh(object sender, EventArgs e) 
    { 
     Refresh(); 
    } 
} 
+0

私はそれをすべてやっています。私はthis.Invalidate()を使ってグラフを更新します。しかし、私のコードで見るように、私はOnPaintで描画をしません。私は図面を行う他のオブジェクトを持っています。 – elector

+1

@elector 'OnPaint'やcalleeによって呼び出され、常にイベントハンドラから与えられた' e.Graphics'オブジェクトを使用している限り、他のメソッドから描画しても問題ありません。 g.Disposeコールを削除すると役立つかどうかを確認してください。初めて私が質問したときに気付かなかった。 – Coincoin

+0

はい! g.Disposeを削除すると解決しました!私はそれがなぜそこにあったのかわかりません、私はC#グラフィックスの本の例に従っており、このコードの平和はそこから来ます!ありがとうございました – elector

関連する問題