0

グラデーションで塗りつぶしたいパネル コントロールがあります。次のコードがあります。

Brush brush = new LinearGradientBrush(pnlBody.ClientRectangle, Color.Black, Color.White, LinearGradientMode.ForwardDiagonal);
pnlBody.CreateGraphics().FillRectangle(brush, pnlBody.ClientRectangle);

しかし、それは効果がありません。pnlBody をフォームに置き換えると、フォームはうまく色付けされますが、パネルは色付けされません。私が間違っていることはありますか?ありがとう!

4

1 に答える 1

6

Panel コントロールは、その Paint イベントで自分自身をペイントします。CreateGraphics() を使用してペイントしたものはすべて消去されます。代わりに Paint イベントを使用する必要があります。ただし、これによりちらつきが発生します。最初に背景がペイントされることがわかります。パネルは、ペイント オーバーヘッドの影響が少ないコンテナ コントロールとして機能するようにも最適化されています。右または下に固定してフォームのサイズを変更すると問題が発生します。

これらの問題を修正するには、Panel から独自のクラスを派生させる必要があります。プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public class GradientPanel : Panel {
    public GradientPanel() {
        this.ResizeRedraw = true;
    }
    protected override void OnPaintBackground(PaintEventArgs e) {
        using (var brush = new LinearGradientBrush(this.ClientRectangle, 
                   Color.Black, Color.White, LinearGradientMode.ForwardDiagonal)) {
            e.Graphics.FillRectangle(brush, this.ClientRectangle);
        }
    }
    protected override void OnScroll(ScrollEventArgs se) {
        this.Invalidate();
        base.OnScroll(se);
    }
}

ビルド + ビルド。ツールボックスの上部から新しいコントロールをフォームにドロップし、元のパネルを置き換えます。グラデーションの開始色と終了色を選択するプロパティを追加することで創造性を発揮し、他のプロジェクトで再利用できるより一般的に役立つコントロールを作成できます。スクロールバーを表示するパネルは避けてください。Windows の「ドラッグ中にウィンドウの内容を表示する」機能が原因で、スクロールを適切に見せることができません。効果は、ポゴにいくらか似ています。

于 2013-04-29T13:09:22.047 に答える