アプリケーションで使用するために、次の(非常に単純な)コントロールを作成しました(簡潔にするためにコメントを削除しました)。
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を最初ではなく最後に呼び出してみました。それが何を変えたのかはわかりませんし、何も変わっていないようです。
背景を描かないことは何の役にも立ちませんでした。アーティファクトはまだ発生しますが、背景色も取得されないため、代わりに水平線の下にあるものの画像が表示されました。