0

C#.Net で Windows フォーム アプリケーション用の独自のカスタム コントロールを構築しようとしています。現在、ペイント イベントを使用して、いくつかの四角形やその他のグラフィック要素をペイントしています。デスクトップのサイズに合わせてアプリ フォームのサイズを変更すると、すべての要素が再描画されます (これはまさに私が必要とする動作です) が、古い要素は背景に表示されます。

ここに私が今やっていることがあります:

Pen penDefaultBorder = new Pen(Color.Wheat, 1);
int margin = 5;
private void CustomControl_Paint(object sender, PaintEventArgs e) {
    CustomControl calendar = (CustomControl)sender;
    Graphics graphics = e.Graphics;
    graphics.Clear(Color.WhiteSmoke);

    graphics.DrawRectangle(penDefaultBorder, margin, margin, calendar.Width - margin * 2, calendar.Height - margin * 2);
    //...
}

graphics.Clear も、graphics.FillRectangle(...) の追加も、古い四角形を表面から隠しません。

アイデア?皆さん、ありがとうございました。

4

2 に答える 2

2

ペイント イベントは通常、キャンバス全体の更新を要求するのではなく、PaintEventArgs で指定された領域のみを要求します。キャンバスの新しく公開された領域のみが PaintEventArgs に渡されているということが起こっていると思います。

これが、Paint イベントでレンダリングを行うべきではない理由の 1 つです。オフスクリーン ビットマップ (バッファー) にレンダリングし、そのバッファーから Paint イベントでコントロールのキャンバスにコピーする必要があります。

ここまたは Google で「ダブル バッファリング」を検索すると、多くの手法の例が表示されます。

于 2010-05-13T15:34:19.520 に答える
1

.Invalidate()フォームを再描画しようとしましたか?

于 2010-05-13T15:17:47.127 に答える