Pregunta

He escrito el control siguiente (muy simple) para su uso en una aplicación (comentarios removidos por razones de brevedad):

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

exención de responsabilidad:. Soy un novato en la pintura de mis propios controles

he elegido para dibujar la línea de esta manera sobre la base de la recomendación href="http://msdn.microsoft.com/en-us/library/aa511459.aspx" rel="nofollow en el Vista directrices UX que sugiere un rectángulo grabado al agua fuerte de la altura 1 para los separadores.

Cuando estática, esto se ve muy bien, pero me he dado cuenta que tengo volver a dibujar los artefactos si escribo este control en una ventana y cambiar su tamaño (por medio de anclaje, por ejemplo). Estoy volver a dibujar mi frontera a lo ancho de toda mi rectángulo cliente, pero es como si no lo es en realidad va a pintar. Permitiendo DoubleBuffered en el constructor del HorizontalRule, o en la forma que está incrustado en, no parece hacer una diferencia tampoco.

¿Qué estoy haciendo mal?

Actualización:

Por la sugerencia, he intentado llamar base.OnPaint último lugar de la primera. No sé lo que habría cambiado, y no parece haber cambiado nada.

No dibujar el fondo logra nada útil. Sigo teniendo el artifacting, pero entonces yo también no consigo el color de fondo así que en vez vi la imagen de lo que estaba por debajo de la línea horizontal.

¿Fue útil?

Solución 2

Puedo hackear una solución que no da lugar a artifacting anulando OnResize () para invalidar todo el control:

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

    this.Invalidate();
}

No estoy seguro de que esta es la solución "correcta", sin embargo.

Otros consejos

Dont llamada base.OnPaint, o llame por última vez (no puedo recordar ahora).

Además, trate reemplazando el método fondo de la pintura, por lo que no llama a la base.

Me gustaría llamar esto en un mapa de bits y luego dibujar el mapa de bits en lugar de preocuparse por la pintura cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top