5

我有一个在 XP 和 Vista 上运行良好的 .NET 2.0 应用程序,但在 Windows 7 RC (x64) 上它崩溃并出现以下错误:

异常信息


异常类型:System.OutOfMemoryException 消息:内存不足。数据:System.Collections.ListDictionaryInternal TargetSite:Void .ctor(System.Drawing.Image,System.Drawing.Drawing2D.WrapMode) HelpLink:NULL 来源:System.Drawing

StackTrace 信息


在 System.Drawing.TextureBrush..ctor(Image image, WrapMode wrapMode) at System.Windows.Forms.ControlPaint.DrawBackgroundImage(Graphics g, Image backgroundImage, Color backColor, ImageLayout backgroundImageLayout, Rectangle bounds, Rectangle clipRect, Point scrollOffset, RightToLeft rightToLeft ) 在 System.Windows.Forms.Control.PaintBackground(PaintEventArgs e, Rectangle rectangle) 在 System.Windows.Forms.Control 的 System.Windows.Forms.Control.PaintBackground(PaintEventArgs e, Rectangle rectangle, Color backColor, Point scrollOffset)。 OnPaintBackground(PaintEventArgs pevent) 在 System.Windows.Forms.ScrollableControl.OnPaintBackground(PaintEventArgs e) 在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 层, Boolean disposeEventArgs) 在 System.Windows.Forms.Control.WmPaint( System.Windows.Forms.Control 处的消息和 m)。WndProc(Message& m) 在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)

关于为什么会发生这种情况的任何想法,或者我如何围绕它进行编程?它只是绘制没有特殊背景的标准winform。

更新:我发现这只是当 BackgroundImageLayout = ImageLayout.Tile 时的问题,这也是默认设置。将其设置为缩放或居中,问题就会消失。但这很不令人满意,因为我需要它来平铺。

4

3 回答 3

4

我有一个类似的问题。在我的情况下,我已经处理了我从中加载图像的 MemoryStream。

//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);
于 2009-07-22T15:02:41.560 回答
1

事实证明,这个问题的解决方案与用于背景的 PNG 文件本身有关。我只是用 Paint.NET 打开它并重新保存它,然后将它放回项目中并且它工作。

不知道发生了什么变化,但它解决了问题。

于 2009-06-12T20:30:44.490 回答
1

在调用 TextureBrush 类进行平铺之前,请不要释放 Image 或关闭获取 Image 的文件流对象。否则 TextureBrush 类将抛出 Out of Memory 异常。

所以更好的方法是通过调用TextureBrush Image来显示平铺的Image,然后在windows窗体的Paint事件中关闭filestream对象。

于 2010-02-15T05:03:41.243 回答