Pergunta

Eu ter executado em um problema estranho ao usar Graphics.DrawImage.

Ao usar e.Graphics.DrawImage(Image, Point) em OnPaint para pintar um bitmap 'tampão' no controle, parece que partes da imagem são omitidos. O tampão é preenchida em um método auxiliar que chama directamente sobre o Bitmap usando um Graphics construída a partir dele. Quando as tintas de controle, o bitmap em cache é desenhado no controle.

Nada parece ser omitido no próprio bitmap, porque quando eu salvo o bitmap para o disco e examinou-o, tudo estava lá. (Veja imagens abaixo)

Isto é o que tamponar o bitmap parece:
tampão
(fonte: zachjohnson.net )

Isto é o que aparece no controle:
valor apresentado
(fonte: zachjohnson.net )

Este é tudo que eu estou fazendo no OnPaint:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    if (this.bufferInvalid)
    {
        this.UpdateBuffer();
    }

    if (this.buffer != null)
    {
        e.Graphics.DrawImage(this.buffer, Point.Empty);
    }
}
Foi útil?

Solução

Quando OnPaint é chamado, o Windows tem uma região inválida que permite pintar em, e tudo o resto é cortado. Quando você quer um controle retangular para ser atualizado, você deve chamar InvalidateRect na API do Windows para se certificar de todo o retângulo é parte da região inválido. OnPaint será chamado automaticamente sempre que houver qualquer parte do controle que é inválido.

Outras dicas

Você poderia tentar um par de coisas diferentes.

  • postar o código para "UpdateBuffer"
  • fazer uma bitmap.save (ou seja buffer.save) após a chamada updatebuffer e verificar o que os olhares de bitmap como.
  • garantir que todos os controles foram elaboradas em primeiro lugar e que há controles estão sendo atraídos transparente etc ..
  • pegar o código de e "tampão update" "OnPaint" e colocá-lo em um projeto separado testando para ver se funciona.
  • tirar "base.onpaint" e verificar o que acontece
  • tentar uma chamada para bitmap.drawimageunscaled vez de bitmap.drawimage
  • tente usar novo ponto (0,0) em vez de point.empty (um tiro loooong mas que você nunca sabe ...)

Toneladas de opções para depurar isso, apenas uma questão de limitando-o.

Confira o System.Windows.Forms.ControlStyles.ResizeRedraw

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