Bitmaps in exe einbinden / Visual Studio Express



  • Wenn eine Bitmap in einer .rc-Datei liegt, wird diese selbstverständlich mitkompiliert.
    Normalerweise kann ein guter Ressourcen-Editor die kompilierten .res-Dateien öffnen und anschauen lassen, dann kannst Du feststellen, ob die Bitmap da drin ist. Alternativ kannst Du sie ja mal in Deinem Program als Icon oder so einbinden, dann siehste ja, ob sie drin ist. Manche Ressourcen-Editoren können sogar Exe-Dateien öffnen und die Ressourcen daraus extrahieren (z. B. von Borland-C++).



  • Hmm, das hilft mir bei Visual Studio Express noch nicht so:
    Meine *.rc (Script?!) wird also in eine *.res kompiliert und die kann ausgelesen werden?! Man kann doch aber auch direkt in die Exe kompilieren oder nicht?
    Sry, wenn ich mich zu doof anstelle - ich weiss ja noch nicht mal sicher, was ich machen muss, damit VSE die rc-Datei überhaupt beachtet.


  • Mod

    Nein!
    Aus der rc Datei macht der Resourcen-Compiler eine .res Datei. Diese .res Datei wird vom Linker in die EXE eingebunden!



  • Ja, das war ein guter Tip! 👍

    Mit der 'Pelles C IDE' scheint das zu gehen, einfach als *.res-File abspeichern.
    Die Datei habe ich dann in Visual-Studio 'bekannt' gegeben.
    Und da ich jetzt Schluß machen muss und deshalb nicht mehr weitersuchen kann:
    **Kann mir jmd. ein kurzes Code-Bsp. schrieben, mit dem ich dann die Bitmaps.res 'auslesen' kann, also im Code damit arbeiten?!
    **THX!!!


  • Mod

    Nur noch mal zur Sicherheit!
    Du erzeugst kein C++/CLI Projekt.

    Wenn die RC-Datei und die Bitmaps in Deinem Projekt sind, dann kannst Du mit LoadBitmap die Bitmap laden!



  • Martin Richter schrieb:

    Nur noch mal zur Sicherheit!
    Du erzeugst kein C++/CLI Projekt.

    Wenn die RC-Datei und die Bitmaps in Deinem Projekt sind, dann kannst Du mit LoadBitmap die Bitmap laden!

    Das Projekt sollte ein Win32-Projekt sein. Die RES-Datei mußte ich mit der anderen IDE erstellen, weil Visual Studio C++ Express das nicht kann.
    Wenn ich mich recht erinnere, dann benutze ich im Moment:

    HANDLE hbitmap = LoadImage( 0, "bitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    

    Dann müssen die Bitmaps halt nur im gleichen Verzeichnis liegen.

    Ich werde also mal loadBitmap googeln, suchen und testen und hoffen, dass die res-Datei wirklich von VSE korrekt eingebunden wird :p
    thx.


  • Mod

    LoadImage geht auch. Du musst dann nur die entsprechende HINSTANCE angeben und die ID oder den Namen der Ressource.



  • Ich probiere das mal. Dann muss ich aber doch sicher statt 'LR_LOADFROMFILE' auch eine andere Konstante benutzen.
    Hoffentlich komme ich morgen zum Ausprobieren.


  • Mod

    Nein! Keine andere Konstante.



  • Sorry, aber ich bekomme das nicht hin. Leider weiß ich nicht einmal, ob die bitmap.res korrekt ist. Muss ich die irgendwie '#include'n?!

    Das ist mein Code:

    #define _CRT_SECURE_NO_DEPRECATE
    #include "stdafx.h"
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE /*hPrevInstance*/,
                         LPSTR     /*lpCmdLine*/,
                         int       /*nCmdShow*/)
    {
        HRESULT res_ = S_OK;
    
    	HANDLE l_Bitmap = LoadImage( GetModuleHandle(NULL), "Bitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    	//HANDLE l_Bitmap = LoadImage( GetModuleHandle(NULL), MAKEINTRESOURCE("8001"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    	//HANDLE l_Bitmap = LoadImage( GetModuleHandle(NULL), "Bitmap.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
    
            //HANDLE l_Bitmap = LoadImage( hInstance, MAKEINTRESOURCE("8001"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    
    	if( l_Bitmap == 0 ) {
    	      DWORD err = GetLastError();
    	}
    
        return err;
    }
    

    Alternativ habe ich für GetModuleHandle(NULL) auch hInstance gesetzt.
    Ich habe aber auch das Gefühl, dass mein res-Detei nicht mit kompiliert wird.... vielleicht kann mit da jemand einen Tip für Visual Studio C++ Express geben!

    Vielleicht können sich Jochen oder Martin (ich nenn euch mal so ;)) sich dazu noch einmal äußern, ihr scheint Euch da ja etwas auszukennen. Ich habe auch MSDN durchforstet, bin aber wohl zu blöd dazu 😕

    ----

    Edit:
    Halt! Bin ein Stück weiter:
    Damit scheint es (was auch immer) zu gehen:

    HANDLE l_Bitmap = LoadImage( hInstance, MAKEINTRESOURCE(8001), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
    

    Einfach die res bekannt geben, dann wird sie mit kompiliert (Dateigrössenvergleich).
    Schade nur, das die Bitmap nicht so aussieht, wie sie vor dem Erzeugen der res-Datei aussah..... 😕

    ----

    Edit:
    So, jetzt hab ich's: mit einer anderen Konstanten paßt dann alles:

    HANDLE l_Bitmap = LoadImage( GetModuleHandle(NULL), MAKEINTRESOURCE(8001), IMAGE_BITMAP, 0, 0, [b]LR_MONOCHROME[/b] );
    

    Die Bitmap war auch korrekt, da es aber nur wenige Pixel hatte und Schwarz/Weiss ist, habe ich nicht gesehen, dass sie nur negiert angezeigt wurde.


Anmelden zum Antworten