Pregunta

Tengo una aplicación .NET 2.0 que funciona bien en XP y Vista, pero en Windows 7 RC (x64) se bloquea con el siguiente error:

Información de excepción


Tipo de excepción: System.OutOfMemoryException Mensaje: sin memoria. Datos: System.Collections.ListDictionaryInternal TargetSite: Void .ctor (System.Drawing.Image, System.Drawing.Drawing2D.WrapMode) Enlace de ayuda: NULL Fuente: System.Drawing

Información de StackTrace


en System.Drawing.TextureBrush..ctor (Imagen de imagen, WrapMode wrapMode) en System.Windows.Forms.ControlPaint.DrawBackgroundImage (Gráficos g, Imagen backgroundImage, Color backColor, ImageLayout backgroundImageLayout, Rectangle fields, Rectangle clipRect, Point scrollOffset, RightToLeft rightToLeft) en System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Rectángulo rectángulo, Color backColor, Point scrollOffset) en System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Rectangle rectangle) en System.Windows.Forms.Control.OnPaintBackground (PaintEventArgs pevent) en System.Windows.Forms.ScrollableControl.OnPaintBackground (PaintEventArgs e) en System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) en System.Windows.Forms.Control.WmPaint (Mensaje & amp; m) en System.Windows.Forms.Control.WndProc (Mensaje & amp; m) en System.Windows.Forms.ScrollableControl.WndProc (Message & amp; m)

¿Alguna idea sobre por qué sucede esto o cómo podría programarlo? Se trata simplemente de pintar una forma de victoria estándar sin fondo especial.

ACTUALIZACIÓN: Descubrí que esto es solo un problema cuando BackgroundImageLayout = ImageLayout.Tile, que también es el valor predeterminado. Establézcalo en Zoom o Centro, y el problema desaparece. Sin embargo, eso es bastante insatisfactorio, porque lo necesito para mosaico.

¿Fue útil?

Solución 2

Resulta que la solución a esto tenía que ver con el archivo PNG utilizado para el fondo. Lo abrí con Paint.NET y lo guardé nuevamente, luego lo volví a poner en el proyecto y funcionó.

No estoy seguro de qué cambió, pero resolvió el problema.

Otros consejos

Tuve un problema similar. En mi caso, deseché mi MemoryStream del que cargué la imagen.

//The following throws and OutOfMemoryException at the TextureBrush.ctor():

    /*someBytes and g declared somewhere up here*/
    Bitmap myBmp = null;
    using(MemoryStream ms = new MemoryStream(someBytes))
       myBmp = new Bitmap(ms);

    if(myBmp != null) //that's right it's not null.
       using(TextureBrush tb = new TextureBrush(myBmp)) //OutOfMemoryException thrown
          g.FillRectangle(tb,0,0,50,50);

//This code does not throw the same error:

    /*someBytes and g declared somewhere up here*/
        MemoryStream ms = new MemoryStream(someBytes);
        Bitmap myBmp = new Bitmap(ms);

        if(myBmp != null)
           using(TextureBrush tb = new TextureBrush(myBmp))
              g.FillRectangle(tb,0,0,50,50);

No deseche la imagen ni cierre el objeto del flujo de archivos de donde obtuvo la imagen antes de llamar a la clase TextureBrush para el mosaico. De lo contrario, la clase TextureBrush lanzará una excepción de memoria insuficiente.

Entonces, la mejor manera es mostrar la imagen en mosaico llamando a la imagen de TextureBrush y luego cerrar el objeto de secuencia de archivos en el evento Paint del formulario de ventanas.

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