2017-02-12 5 views
0

境界線(2つの長方形からなる)を描画するカスタムパネルを作成しました。問題は、ウィンドウのサイズを変更した場合、Windows XPのソリティアのアニメーションと同じように残っていることです。下のスクリーンショットを参照してください。私は右にウィンドウのサイズを変更しました。OnPaint()で描画すると、ウィンドウのサイズが変更されたときに残渣になる

何が問題なのですか?これをどのように修正できますか?まず

Resized window to the right

protected override void OnPaint(PaintEventArgs e) 
{ 
    var outer = ClientRectangle; 
    outer.Width -= 1; 
    outer.Height -= 1; 
    var inner = outer; 
    inner.X++; 
    inner.Y++; 
    inner.Width -= 2; 
    inner.Height -= 2; 

    e.Graphics.DrawRectangle(DarkPen, outer); 
    e.Graphics.DrawRectangle(WhitePen, inner); 

    base.OnPaint(e); 
} 

UPDATE

私は以前に描かれた長方形を削除していなかったので、私はこれはと思いました。だから私はFillRectangleを呼び出して内部を削除しました。

var contentArea = inner; 
contentArea.X++; 
contentArea.Y++; 
contentArea.Width -= 2; 
contentArea.Height -= 2; 
e.Graphics.FillRectangle(SystemBrushes.Control, contentArea); 

しかし、どちらも機能しませんでした。コントロールは、領域全体ではなく、新たに展開された部分だけを塗りつぶすように見えます。

答えて

4

フォームクラスはコンテナコントロールに最適化されています。コンテナには通常、塗りつぶす背景色だけがあります。だから、あなたが気づいたように、実際には「新しい塗りつぶし部分のみ塗装する」。または、より正確には、以前のピクセルを上書きしないで、生成するスメア効果から簡単に認識できます。ウィンドウのサイズを変更するとWinformsのデザインが少し活発になりますが、フォームにたくさんのコントロールがあり、かなり目立つようになるとボトルネックになります。

ResizeRedrawプロパティをtrueに設定する必要があるため、必要に応じてサーフェス全体を再描画します。 DoubleBufferedプロパティをtrueに設定すると、描画コードが複雑になり、ちらつきに気づくようになっても、問題は発生しません。

ので、大まか:のOnPaintを最適化

public Form1() { 
     InitializeComponent(); 
     this.ResizeRedraw = true; 
     this.DoubleBuffered = true; 
    } 

は()あなたは汚れた領域に対する描画何Windows自体すでにクリップ、一般的に報わ戦略ではありません。

+0

これは機能しますが、これが推奨される方法であるかどうかは不思議です。つまり、すべての領域を再描画する必要があるわけではありません(上記のアップデートでは、コンテンツ領域全体をすばやく汚れた解決策として確実に満たす必要があります)。代わりに更新する必要がある領域を指定することはできますか? –

+2

領域を指定していないため、オペレーティングシステムによって領域が指定されています。 e.ClipRectangleプロパティとして渡されます。実際にそれを使って、すでにそれを使用しているOSと競争するのはかなり難しいです。さて、描画オブジェクトがクリップ矩形の外に完全に落ちたときに、あなた自身のコードで多くのデータに触れることを避けることができます。あなたが持っているものは、長い間、それを受ける資格はありません。 –

関連する問題