Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Bitmaps in VS.Net Projekten laden

Die Verarbeitung von Resourcen wie zum Beispiel Bitmaps zur Laufzeit von Programmen die Sie mit dem Visual Studio erstellen ist ein wenig merkwürdig - unverständlich sogar, würde ich sagen. Das ganze Modell erscheint ein unausgegoren... Trotzdem kann man natürlich Bitmaps laden.

So gehts:

Angenommen Sie haben ein Projekt in dem sich das Bitmap 'Bitmap1.bmp' befindet. Dieses Bitmap soll nun im Code geladen werden. Das geht im Prinzip so:

Bitmap bmp = new Bitmap( GetType(), "Bitmap1.bmp");

Der Type spezifiziert dabei die Assembly in der sich das Bitmap befindet. Mit anderen Worten: Man legt damit fest, das sich die Bitmap-Resource in der gleichen Assembly befindet wie 'Type'. Der String gibt einfach den Namen der Resource an.

Wenn man diesen Code übersetzt und ausführt bekommt man aber eine Exception... :(

Grund: Es reicht nicht die Bitmap ins Projekt aufzunehmen. Man muss auch (manuell, und zwar jedes mal wenn man ein neues Bitmap anlegt !) festlegen das das Bitmap tatsächlich mit ins Binary soll. Dazu muss man in den Properties der Bitmap die Eigenschaft 'BuildAction' von 'Content' auf 'Embedded Resource' stellen. Dann gehts.

Aber auch nur so lange sich der abgebildete Code in einer Klasse befindet, die sich selbst direkt im Default-Namespace des Projektes befindet. Ist außerdem noch ein Namenspace namens 'Test' vorhanden - liegt der Code also in der Klasse 'Form1' in 'DefaultNamespace.Test' - bekommt man wieder eine Exception.

Grund: Der zugrunde liegende Resource-Manager baut den Namen der gesuchten Resource aus der Assembly von 'Type' und aus dem Namespace von Type zusammen. Es wird dann also das Bitmap 'DefaultNamespace.Test.Bitmap1.bmp' gesucht - und das gibts nicht.

Lösung: Man muss das Bitmap im Projekt umbennen - und zwar in Test.Bitmap1.bmp.

Einfache aber beknackte Regel: Das Bitmap muss im Projekt mit einem Namen vorliegen, der den kompletten Pfad im Namespace des 'Types' bis aufs erste Element enthält.

Wer immer sich das ausgedacht hat sollte dafür bestraft werden. Ist natürlich nur meine Meinung...

Comments (2) -

  • Uwe Thomas

    8/28/2004 4:08:59 PM |

    Soweit ich weiß sollte es ausreichen, wenn man die Bitmap in das gleiche Verzeichnis wie die Klasse kopiert. Der Namespace der Klasse muss dafür so heißen wie das Verzeichnis. (so wie es vom Studio normalerweise angelegt wird)
    Der Namespace kommt übrigens durch das GetType(). Wenn man den Type einer Klasse aus dem Default-Namespace übergibt, sollte es auch ohne Umbenennen oder Verschieben der Bitmap gehen.

    Thomas Wölfer? Haben Sie zufällig in Bielefeld Studiert?

    Grüße aus Bielefeld
    Uwe Thomas

  • thomas woelfer

    8/29/2004 5:53:49 AM |

    Uwe,

    nein - nicht in bielefeld.

    WM_CHEERS
    thomas woelfer

Comments are closed