Pergunta

Eu escrevi o seguinte controle (muito simples) para uso em um aplicativo (comentários removidos por brevidade):

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

Disclaimer: Eu sou um novato em pintar meus próprios controles

.

Eu escolhi para desenhar a linha desta forma baseada na href="http://msdn.microsoft.com/en-us/library/aa511459.aspx" rel="nofollow recomendação no Vista orientações UX que sugere um rectângulo gravado de uma altura para os separadores.

Quando estática, isso parece bom, mas eu tenho notado que eu recebo redesenhar artefatos se eu colocar este controle em uma janela e redimensioná-lo (via âncora, por exemplo). Estou redesenhando minha beira sobre a largura toda a minha retângulo cliente, mas é como se ele não está realmente sendo pintado. Permitindo DoubleBuffered no construtor do HorizontalRule, ou na forma que ele é incorporado, não parece fazer a diferença também.

O que estou fazendo de errado?

Update:

Por sugestão, eu tentei ligar base.OnPaint última vez de primeira. Eu não sei o que teria mudado, e não parece ter mudado nada.

Não desenhar o fundo realizou nada útil. Eu ainda obter o artifacting, mas então eu também não obter a cor de fundo imagem serra então ao invés eu de tudo o que estava por baixo da linha horizontal.

Foi útil?

Solução 2

Eu posso cortar uma solução que não resulte em artifacting, substituindo OnResize () para invalidar todo o controle:

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

    this.Invalidate();
}

Eu não tenho certeza de que esta é a solução "certa", no entanto.

Outras dicas

Não chamada base.OnPaint, ou chamá-lo passado (eu não posso lembrar agora).

Além disso, tente substituir o método de pintura de fundo, para que ele não chamar a base.

Gostaria de chamar isso em um bitmap, em seguida, desenhar o bitmap em vez de se preocupar com a pintá-la de cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top