代码之家  ›  专栏  ›  技术社区  ›  Greg D

我的自定义“水平规则”控件有什么问题?

  •  0
  • Greg D  · 技术社区  · 16 年前

    我编写了以下(非常简单)控件以在应用程序中使用(为了简洁起见删除了注释):

    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的蚀刻矩形。

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

    我做错什么了?

    更新:

    根据建议,我试着打给base.onpaint last而不是first。我不知道会发生什么变化,而且似乎也没有任何变化。

    不画背景没什么用。我仍然得到了人工制品,但是我也没有得到背景颜色,所以我看到了水平线下的图像。

    3 回复  |  直到 16 年前
        1
  •  1
  •   leppie    16 年前

    不要打电话 base.OnPaint 或者说是最后一次(我现在想不起来了)。

    另外,尝试重写background paint方法,这样它就不会调用base。

        2
  •  1
  •   Greg D    16 年前

    我可以通过重写onResize()使整个控件失效来破解不会导致伪影的解决方案:

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

    不过,我不确定这是“正确”的解决方案。

        3
  •  0
  •   Daniel A. White    16 年前

    我会在位图上绘制这个,然后绘制位图,而不是每次都担心要绘制它。