Pregunta

Me he encontrado con un problema extraño al usar Graphics.DrawImage .

Cuando se usa e.Graphics.DrawImage (Image, Point) en OnPaint para pintar un 'buffer' de mapa de bits en el control, parece que partes de la imagen son omitido El búfer se rellena en un método auxiliar que se basa directamente en el Bitmap utilizando un Graphics construido a partir de él. Cuando el control pinta, el mapa de bits en caché se dibuja en el control.

Parece que no se omite nada en el mapa de bits en sí mismo, porque cuando guardé el mapa de bits en el disco y lo examiné, todo estaba allí. (ver imágenes a continuación)

Así es como se ve el búfer de mapa de bits:
buffer
(fuente: zachjohnson.net )

Esto es lo que aparece en el control:
valor mostrado
(fuente: zachjohnson.net )

Esto es todo lo que estoy haciendo en 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);
    }
}
¿Fue útil?

Solución

Cuando se llama a OnPaint, Windows tiene una región no válida en la que permite pintar, y todo lo demás se recorta. Cuando desee que se actualice un control rectangular, debe llamar a InvalidateRect en la API de Windows para asegurarse de que todo el rectángulo sea parte de la región no válida. Se llamará automáticamente a OnPaint cuando haya alguna parte del control que no sea válida.

Otros consejos

Puedes probar un par de cosas diferentes.

  • publique el código en " UpdateBuffer "
  • haga un bitmap.save (es decir, buffer.save) después de la llamada updatebuffer y verifique el aspecto del mapa de bits.
  • asegúrese de que todos los controles se hayan dibujado primero y de que no se dibujen controles transparentes, etc.
  • tome el código de " onpaint " y " actualizar el búfer " y ponerlo en una prueba de proyecto separada para ver si funciona.
  • sacar " base.onpaint " y verifica qué pasa
  • intente llamar a bitmap.drawimageunscaled en lugar de bitmap.drawimage
  • intente usar un nuevo punto (0,0) en lugar de point.empty (un tiro muuuucho pero nunca se sabe ...)

Toneladas de opciones para depurar esto, solo es cuestión de reducirlo.

Consulte el System.Windows.Forms.ControlStyles.ResizeRedraw

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