2009-04-30 14 views
5

Mam aplikacji .NET 2.0, który działa dobrze na XP i Vista, ale na Windows 7 RC (x64) ulega awarii z powodu następującego błędu:Windows 7 TextureBrush..ctor() Błąd

Exception Informacje


Wyjątek Typ: System.OutOfMemoryException Wiadomość: Out of memory. Dane: System.Collections.ListDictionaryInternal TargetSite: Void .ctor (System.Drawing.Image, System.Drawing.Drawing2D.WrapMode) HelpLink: NULL Źródło: System.Drawing

StackTrace Informacja


w System.Drawing.TextureBrush..ctor (Obraz obrazu, WrapMode wrapMode) w System.Windows.Forms.ControlPaint.DrawBackgroundImage (Grafika g, Obraz tła, Kolor tła, ImageLayout backgroundImageLayout, Obramowanie prostokątów, Rectangle clipRect, Punkt scrollOffset , RightToLeft rightToLeft) w System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, prostokąt prostokąta, Color backColor, Point scrollOffset) w System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Prostokąt prostokąt) w System.Windows.Forms. Control.OnPaintBackground (PaintEventArgs pevent) w System.Windows.Forms.ScrollableControl.OnPaintBackground (PaintEventArgs e) w System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e warstwa Int16, logiczne disposeEventArgs) w System.Windows.Forms .Control.WmPaint (Message & m) w System.Windows.Forms.Control.WndProc (Message & m) w System.Windows.Forms.ScrollableControl.WndProc (Message & m)

Jakieś pomysły na temat tego, dlaczego tak się dzieje lub w jaki sposób mogę go programować? To tylko malowanie standardowej winoteki bez specjalnego tła.

AKTUALIZACJA: Odkryłem, że jest to problem tylko wtedy, gdy BackgroundImageLayout = ImageLayout.Tile, który jest również domyślny. Ustaw go na Powiększ lub Wyśrodkuj, a problem zniknie. To całkiem niezadowalające, ponieważ potrzebuję go do wyłożenia.

+0

Czy działa poprawnie na XP i Vista ** 64-bit **? –

+0

Tak, działa dobrze zarówno w 32-, jak i 64-bitowych wersjach XP i Vista. –

+0

Dzięki (był to strzał w ciemno, ostatnio miałam podobne kłopoty związane z problemami z krzyżem). Przepraszam, brak pomysłów. –

Odpowiedz

1

Okazało się, że rozwiązanie to miało związek z samym plikiem PNG używanym w tle. Właśnie otworzyłem go za pomocą Paint.NET i zapisałem go, a następnie włożyłem z powrotem do projektu i zadziałało.

Nie wiem, co się zmieniło, ale rozwiązało problem.

+0

to rozwiązało mój problem .. thnx –

3

Miałem podobny problem. W moim przypadku usunąłem mój MemoryStream, z którego załadowałem obraz.

//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

To był dokładnie mój problem. Czy ktoś, kto rozumie .net "pod maską", nie chce wyjaśnić tego zachowania? – Dinei

1

Proszę nie wyrzucać obraz lub zamknięciu obiektu FILESTREAM skąd masz obraz przed wywołaniem klasy TextureBrush do układania płytek. W przeciwnym razie klasa TextureBrush wygeneruje wyjątek braku pamięci.

Tak więc lepszym sposobem jest wyświetlenie kafelkowego obrazu poprzez wywołanie obrazu TextureBrush, a następnie zamknięcie obiektu filestream w zdarzeniu Paint okna formularza.