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;
    }
}

免责声明:我是绘制自己的控件的新手。

我选择根据Vista UX 指南中的建议以这种方式画线,该指南建议使用高度为 1 的蚀刻矩形作为分隔符。

当静态时,这看起来不错,但我注意到如果我将此控件放在窗口中并调整它的大小(例如通过锚点),我会得到重绘工件。我在整个客户矩形的宽度上重新绘制了我的边框,但这就像它实际上并没有被绘制一样。在 Horizo​​ntalRule 的构造函数中或以嵌入的形式启用 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 回答