1

フォームの背景にグラデーションを作成しましたが、現在この問題が発生しています。winforms では、フォームを最小化してから最大化すると、次のようになります。

imageshack.us/photo/my-images/35/errorbl.png .

バグは、最大化後にフォームを再描画する必要があり、そうしないことだと思います。誰かがそれを解決する方法を知っていますか?

ありがとう!

呼び出し勾配:

public Base()
    {
        InitializeComponent();

        this.Paint += new PaintEventHandler(Form_Background);

    }

勾配法:

public void Form_Background(object sender, PaintEventArgs e)
    {
        Color c1 = Color.FromArgb(255, 252, 254, 255);
        Color c2 = Color.FromArgb(255, 247, 251, 253);
        Color c3 = Color.FromArgb(255, 228, 239, 247);
        Color c4 = Color.FromArgb(255, 217, 228, 238);
        Color c5 = Color.FromArgb(255, 200, 212, 217);
        Color c6 = Color.FromArgb(255, 177, 198, 215);
        Color c7 = Color.FromArgb(255, 166, 186, 208);

        LinearGradientBrush br = new LinearGradientBrush(this.ClientRectangle, c1, c7, 90, true);
        ColorBlend cb = new ColorBlend();
        cb.Positions = new[] { 0, (float)0.146, (float)0.317, (float)0.439, (float)0.585, (float)0.797, 1 };
        cb.Colors = new[] { c1, c2, c3, c4, c5, c6, c7 };
        br.InterpolationColors = cb;


        // paint
        e.Graphics.FillRectangle(br, this.ClientRectangle);
    }
4

1 に答える 1

3

それが機能しない理由は、this.ClientRectangle最小化された後の幅と高さがゼロであるためです。

グラデーションを適用して描画する前に、長方形のチェックを実装する必要があります。

Rectangle r = this.ClientRectangle;

if (r.Width > 0 && r.Height > 0) {

    //draw

}

したがって、コードは次のようになります。

public void Form_Background(object sender, PaintEventArgs e) {

    Rectangle r = this.ClientRectangle;

    if (r.Width > 0 && r.Height > 0) {

        Color c1 = Color.FromArgb(252, 254, 255);
        Color c2 = Color.FromArgb(247, 251, 253);
        Color c3 = Color.FromArgb(228, 239, 247);
        Color c4 = Color.FromArgb(217, 228, 238);
        Color c5 = Color.FromArgb(200, 212, 217);
        Color c6 = Color.FromArgb(177, 198, 215);
        Color c7 = Color.FromArgb(166, 186, 208);

        LinearGradientBrush br = new LinearGradientBrush(r, c1, c7, 90, true);
        ColorBlend cb = new ColorBlend();
        cb.Positions = new[] { 0, (float)0.146, (float)0.317, _
                                  (float)0.439, (float)0.585, _
                                  (float)0.797, 1 };

        cb.Colors = new[] { c1, c2, c3, c4, c5, c6, c7 };
        br.InterpolationColors = cb;

        // paint
        e.Graphics.FillRectangle(br, r);

        br.Dispose; //added dispose for the brush

    }
}
于 2012-12-06T01:23:33.313 に答える