境界線(2つの長方形からなる)を描画するカスタムパネルを作成しました。問題は、ウィンドウのサイズを変更した場合、Windows XPのソリティアのアニメーションと同じように残っていることです。下のスクリーンショットを参照してください。私は右にウィンドウのサイズを変更しました。OnPaint()で描画すると、ウィンドウのサイズが変更されたときに残渣になる
何が問題なのですか?これをどのように修正できますか?まず
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);
しかし、どちらも機能しませんでした。コントロールは、領域全体ではなく、新たに展開された部分だけを塗りつぶすように見えます。
これは機能しますが、これが推奨される方法であるかどうかは不思議です。つまり、すべての領域を再描画する必要があるわけではありません(上記のアップデートでは、コンテンツ領域全体をすばやく汚れた解決策として確実に満たす必要があります)。代わりに更新する必要がある領域を指定することはできますか? –
領域を指定していないため、オペレーティングシステムによって領域が指定されています。 e.ClipRectangleプロパティとして渡されます。実際にそれを使って、すでにそれを使用しているOSと競争するのはかなり難しいです。さて、描画オブジェクトがクリップ矩形の外に完全に落ちたときに、あなた自身のコードで多くのデータに触れることを避けることができます。あなたが持っているものは、長い間、それを受ける資格はありません。 –