Windows 7 TextureBrush..ctor()エラー
質問
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情報
at System.Drawing.TextureBrush..ctor(Image image、WrapMode wrapMode) 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、四角形の四角形、色backColor、ポイントscrollOffset) System.Windows.Forms.Control.PaintBackground(PaintEventArgs e、長方形の長方形)で System.Windows.Forms.Control.OnPaintBackground(PaintEventArgs pevent)で System.Windows.Forms.ScrollableControl.OnPaintBackground(PaintEventArgs e)で System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e、Int16レイヤー、ブールdisposeEventArgs) System.Windows.Forms.Control.WmPaint(Message& m)で System.Windows.Forms.Control.WndProc(Message& m)で System.Windows.Forms.ScrollableControl.WndProc(Message& m)で
これがなぜ起こっているのか、それをどのようにプログラムするのかについてのアイデア特別な背景のない標準のwinformをペイントしているだけです。
更新: BackgroundImageLayout = ImageLayout.Tileがデフォルトでもある場合にのみ、これが問題になることがわかりました。ズームまたは中央に設定すると、問題は消えます。タイル化する必要があるので、それはかなり不十分です。
解決 2
これに対する解決策は、背景に使用されるPNGファイル自体に関係していました。 Paint.NETで開いて再保存し、プロジェクトに戻しただけで機能しました。
何が変わったのかはわかりませんが、問題は解決しました。
他のヒント
同様の問題がありました。私の場合、イメージをロードした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);
TextureBrushクラスを呼び出してタイル化する前に、Imageを破棄したり、Imageを取得した場所からfilestreamオブジェクトを閉じたりしないでください。そうでない場合、TextureBrushクラスはメモリ不足例外をスローします。
より良い方法は、TextureBrush Imageを呼び出してタイル化された画像を表示し、WindowsフォームのPaintイベントでfilestreamオブジェクトを閉じることです。