Graphics.DrawImage nem sempre pintar o bitmap inteiro?
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:
(fonte: zachjohnson.net )
Isto é o que aparece no controle:
(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);
}
}
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