Não é o tipo de cintilação que o buffer duplo pode resolver. Nem BeginUpdate ou SuspendLayout. Você tem muitos controles, o BackgroundImage pode torná-lo muito pior.
Ele começa quando o UserControl se pinta. Ele desenha o BackgroundImage, deixando buracos onde vão as janelas de controle filho. Cada controle filho recebe uma mensagem para pintar a si mesmo, eles preencherão a lacuna com o conteúdo da janela. Quando você tem muitos controles, esses buracos ficam visíveis para o usuário por um tempo. Eles são normalmente brancos, contrastando mal com BackgroundImage quando está escuro. Ou podem ser pretos se o formulário tiver a propriedade Opacity ou TransparencyKey definida, contrastando mal com quase tudo.
Esta é uma limitação fundamental do Windows Forms, ela está presa na maneira como o Windows renderiza as janelas. Corrigido por WPF btw, ele não usa janelas para controles filho. O que você deseja é o buffer duplo de todo o formulário, incluindo os controles filhos. Isso é possível, verifique meu código neste segmento para a solução. Porém, tem efeitos colaterais e não aumenta a velocidade de pintura. O código é simples, cole no seu formulário (não no controle do usuário):
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Há muitas coisas que você pode fazer para melhorar a velocidade de pintura, a ponto de a cintilação não ser mais perceptível. Comece abordando o BackgroundImage. Eles podem ser muito caros quando a imagem de origem é grande e precisa ser reduzida para caber no controle. Altere a propriedade BackgroundImageLayout para "Tile". Se isso fornecer uma aceleração perceptível, volte para o seu programa de pintura e redimensione a imagem para uma melhor correspondência com o tamanho de controle típico. Ou escreva o código no método OnResize () do UC para criar uma cópia de tamanho adequado da imagem para que ela não precise ser redimensionada toda vez que o controle redesenhar. Use o formato de pixel Format32bppPArgb para essa cópia, ele renderiza cerca de 10 vezes mais rápido do que qualquer outro formato de pixel.
A próxima coisa que você pode fazer é evitar que os buracos sejam tão perceptíveis e contrastem mal com a imagem. Você pode desativar o sinalizador de estilo WS_CLIPCHILDREN para o UC, o sinalizador que impede o UC de pintar na área onde os controles filhos vão. Cole este código no código do UserControl:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
Os controles filhos agora vão se pintar no topo da imagem de fundo. Você ainda pode vê-los se pintando um por um, mas o feio buraco branco intermediário ou negro não será visível.
Por último, mas não menos importante, reduzir o número de controles filho é sempre uma boa abordagem para resolver problemas de pintura lenta. Substitua o evento OnPaint () do UC e desenhe o que agora é mostrado em um filho. Rótulo específico e PictureBox são muito desperdiçadores. Conveniente para apontar e clicar, mas sua alternativa leve (desenhar uma string ou uma imagem) leva apenas uma única linha de código em seu método OnPaint ().
UpdateStyles
depois de definir isso? Está mal documentado, mas às vezes pode ser necessário.