0

アプリケーションで使用するために、次の(非常に単純な)コントロールを作成しました(簡潔にするためにコメントを削除しました)。

public partial class HorizontalRule : Control
{
    public HorizontalRule()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        var g = e.Graphics;

        var rect = new Rectangle(
            this.ClientRectangle.Left,
            this.ClientRectangle.Height / 2 + 1, 
            this.ClientRectangle.Width,
            1);

        ControlPaint.DrawBorder3D(g, rect, Border3DStyle.Etched);

        return;
    }
}

免責事項:私は自分のコントロールをペイントするのは初心者です。

セパレーターに高さ1のエッチングされた長方形を提案する、Vista UXガイドラインの推奨事項に基づいて、この方法で線を引くことにしました。

静的な場合、これは問題ないように見えますが、このコントロールをウィンドウに配置してサイズを変更すると(アンカーなどを使用して)、アーティファクトが再描画されることに気付きました。クライアントの長方形の幅全体に境界線を再描画していますが、実際にはペイントされていないようです。ホリゾンタルルールのコンストラクターで、またはそれが埋め込まれている形式でDoubleBufferedを有効にしても、違いはないようです。

私は何が間違っているのですか?

アップデート:

提案に従って、base.OnPaintを最初ではなく最後に呼び出してみました。それが何を変えたのかはわかりませんし、何も変わっていないようです。

背景を描かないことは何の役にも立ちませんでした。アーティファクトはまだ発生しますが、背景色も取得されないため、代わりに水平線の下にあるものの画像が表示されました。

4

3 に答える 3

1

を呼び出さないbase.OnPaintか、最後に呼び出します (今は思い出せません)。

また、バックグラウンド ペイント メソッドをオーバーライドして、ベースを呼び出さないようにしてください。

于 2009-04-16T17:27:44.367 に答える
1

OnResize() をオーバーライドしてコントロール全体を無効にすることで、アーティファクトが発生しないソリューションをハックできます。

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);

    this.Invalidate();
}

ただし、これが「正しい」解決策であるかどうかはわかりません。

于 2009-04-16T17:56:22.783 に答える
0

これをビットマップに描画してから、毎回ペイントすることを心配するのではなく、ビットマップを描画します。

于 2009-04-16T17:14:09.453 に答える