4

ContainerControlをベースとして使用して、単純なカスタム パネルを作成しました。カスタム プロパティを追加して、境界線とグラデーションの背景を作成しました。OnPaint と OnPaintBackground をオーバーライドすると、親のすべての子コントロールがグラデーションと境界線のスタイルを継承します。回避策として、親の BackgroundImage プロパティを使用しました。これは正常に機能しますが、ランダムな癖がいくつかあります。この問題にアプローチするより良い方法が必要ですが、解決策が見つかりませんでした。これを修正するための相互運用機能またはその他の C# メソッドを介した Window API 関数はありますか? もしそうなら、例を挙げてください。

編集!コピーされるスタイルは次のとおりです (見苦しい例ですが、要点を説明します)。

ここに画像の説明を入力

編集2!これは、すべてのプロパティ、デザイナー属性などを含まない単純なハードコードされた ContainerControl です。

public class Container : ContainerControl
{
    protected override void OnPaintBackground( PaintEventArgs e )
    {
        using ( var brush = new LinearGradientBrush( e.ClipRectangle, Color.Red, Color.Blue, LinearGradientMode.Vertical ) )
        {
            e.Graphics.FillRectangle( brush, e.ClipRectangle );
        }
    }
}
4

3 に答える 3

3

プロパティを に設定してLabelコントロールを作成すると、親の実装を呼び出すことになります。BackColorColor.TransparentOnPaintBackground()

Jon の例を次のように変更すると、次のようになります。

var label = new Label { 
    Text = "Label",
    Location = new Point(20, 50),
    BackColor = Color.Transparent
};

次に、問題を再現します。

ただし、簡単な回避策があります。問題は、線形グラデーション ブラシを作成する方法に起因します。コンストラクターに渡すe.ClipRectangleため、グラデーションの形状は、レンダリングされるコントロール (コンテナーまたはラベル) によって異なります。一方、コンテナのClientRectangleを渡すと、グラデーションは常に同じ形状になり、結果は探しているものになります。

protected override void OnPaintBackground(PaintEventArgs e)
{
    using (var brush = new LinearGradientBrush(ClientRectangle,
           Color.Red, Color.Blue, LinearGradientMode.Vertical)) {
        e.Graphics.FillRectangle(brush, e.ClipRectangle);
    }
}

結果は次のとおりです。

ここに画像の説明を入力

于 2012-08-23T07:40:46.040 に答える
0

Windows 7 マシンでこれを単純に再現することはできません。これは、デザイナーで設定したプロパティの 1 つである可能性があることを示唆しています。短いが完全なプログラム:

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

public class GradientContainer : ContainerControl
{
    protected override void OnPaintBackground(PaintEventArgs e)
    {
        using (var brush = new LinearGradientBrush(e.ClipRectangle, 
                       Color.Red, Color.Blue, LinearGradientMode.Vertical))
        {
            e.Graphics.FillRectangle(brush, e.ClipRectangle);
        }
    }
}

class Test
{
    static void Main()
    {
        var label = new Label { 
            Text = "Label",
            Location = new Point(20, 50)
        };
        var container = new GradientContainer {
            Size = new Size(200, 200),
            Location = new Point(0, 0),
            Controls = { label }
        };        

        Form form = new Form {
            Controls = { container },
            Size = new Size(300, 300)
        };
        Application.Run(form);
    } 
}

そして結果:

ラベルにグラデーションがありません

于 2012-08-22T06:01:09.487 に答える
0

コントロールの作成/読み込み時にプロパティを初期化する

次に、コントロールを「無効化」して、コントロールの再描画を強制します

于 2012-08-21T18:53:42.577 に答える