2009-04-30 20 views
5

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

Excepción información


Tipo de excepción: System.OutOfMemoryException mensaje: Fuera de memoria. datos: System.Collections.ListDictionaryInternal TargetSite: .ctor Vacío (System.Drawing.Image, System.Drawing.Drawing2D.WrapMode) HelpLink: NULL Fuente: System.Drawing

StackTrace información


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, Límites de rectángulo, Rectángulo clipRect, Punto scrollOffset , RightToLeft rightToLeft) en System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Rectangle rectangle, 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, capa Int16, disposeEventArgs booleanas) en System.Windows.Forms .Control.WmPaint (Mensaje & m) en System.Windows.Forms.Control.WndProc (Mensaje & m) en System.Windows.Forms.ScrollableControl.WndProc (Mensaje & m)

¿Alguna idea sobre por qué esto está sucediendo o cómo puedo programarla? Solo está pintando un formulario estándar sin antecedentes especiales.

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

+0

¿Funciona bien en XP y Vista ** de 64 bits **? –

+0

Sí, funciona bien en las versiones de 32 y 64 bits de XP y Vista. –

+0

Gracias (era un tiro en la oscuridad, tenía algunos problemas de sonido similares relacionados con problemas de arco cruzado recientemente.) Lo siento, sin ideas. –

Respuesta

1

Resulta que la solución a esto tenía que ver con el archivo PNG en sí utilizado para el fondo. Acabo de abrirlo con Paint.NET y volver a guardarlo, luego volver a ponerlo en el proyecto y funcionó.

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

+0

esto resolvió mi problema ... thnx –

3

Tuve un problema similar. En mi caso, me deshice de mi MemoryStream de donde 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); 
+0

Ese fue exactamente mi problema. ¿Alguien que entiende .net "bajo el capó" se molesta en explicar este comportamiento? – Dinei

1

No deseche la imagen o cerrar el objeto filestream desde donde tienes la imagen antes de llamar a la clase TextureBrush para el alicatado. De lo contrario, la clase TextureBrush emitirá una excepción de falta de memoria.

Así que la mejor manera es mostrar la imagen embaldosada llamando a la imagen TextureBrush y luego cerrar el objeto filestream en el evento Paint del formulario de Windows.