我在做什么我的自定义“Horizo​​ntalRule”控件有问题?

问题描述:

我写利用下述(很简单)控制在一个应用程序(注释为简洁起见删除):我在做什么我的自定义“Horizo​​ntalRule”控件有问题?

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

免责声明:我在画我自己的控制是一个新手。

我选择以这种方式绘制线条,基于recommendation in the Vista UX guidelines,这表明分隔符的高度为1的蚀刻矩形。

当静态时,这看起来很好,但我注意到,如果将此控件放置在窗口中并调整其大小(通过锚点,例如),我会重绘工件。我在我的整个客户矩形的宽度上重绘我的边框,但它就像没有真正被绘制。在Horizo​​ntalRule的构造函数中启用DoubleBuffered,或以其嵌入的形式启用,似乎也没有什么区别。

我在做什么错?

更新:

%的建议,我打过电话base.OnPaint最后,而不是第一个。我不知道会发生什么变化,也不会改变任何事情。

没有画出背景没有用处。我仍然得到了伪像,但是我也没有得到背景颜色,所以我看到了水平线下的任何图像。

我能砍不通过重写onResize受到导致伪像的解决方案()无效整个控制。

我会在位图上绘制该图,然后绘制位图而不用担心每次都会绘制它。

+0

你是什么意思?第一次显示控件时,将边框绘制到位图上,然后在控件的宽度上拉伸该位图? – 2009-04-16 17:21:52

+0

这可以工作,我指的是缓存它。 – 2009-04-16 18:28:04

不要打电话base.OnPaint,或者最后打电话给我(我现在不能回忆)。

此外,尝试覆盖背景涂色方法,所以它不会调用基地。然而

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

    this.Invalidate(); 
} 

我不知道这是“正确”的解决方案,:

+0

不绘制背景肯定会是一个开始 – 2009-04-16 17:50:09