Bitmaps in exe einbinden / Visual Studio Express
-
Hallo,
ich bin's mal wieder.
Ich komme nicht weiter und finde einfach nicht den richtigen Ansatz:
Ich benutze Visual Studio Express und möchte gern 3 kleine Bitmaps, die ich in meinem C++-Programm benutze mit in die Exe einbinden oder zumindest in einer Datei befügen.
Geht das so mit VSE? Ich habe etwas wie 'verwaltete Ressourcendatei einbinden' gefunden, aber wie komme ich an die Datei und überhaupt und so
Vielleicht habe ich da auch einen Denkfehler drin?Thx.
-
Hast Du eine Win32-Anwendung oder machst Du C++/CLI???
Bei Win32 kannst Du eine Resource-Datei einfügen; hierzu brauchst Du aber einen separaten Resource-Editor da im VC2005EE keiner dabei ist (siehe
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html
)
Wenn Du eine managed Applikation hast, soltest Du auch die Managed-Resorucen verwenden (siehe ResourceManager-class)
-
Wow, schnelle Antwort. So konkret habe ich das auch nicht gefunden!
Ich schreibe ein Win32-Prg.Also lade ich mir einen der Res-Editoren (Empfehlung?!) bastle mir damit eine Res.-Datei und die kann mir VSE mit in die exe kompilieren.
Richtig?Edit:
Ach ja, 2. Frage - kurz eingeschoben: Beim Vector bleibt die Reihenfolge erhalten, oder?
-
Du machst damit eine "*.rc" Datei! welche Du dann Deinem Projekt hinzufügst...
Und zur vector-Frage: Ja.
-
thx, melde mich wieder, wenn ich nicht weiterkomme.
Gibt's Vorschläge, welchen Editor ich benutzen soll?
-> OK, ich habe den ersten in der Liste benutzt, einfach aber funzt.
-
Jetzt stelle ich mich aber mal wieder blöd an:
- Ich habe mit dem Editor eine bilder.rc erstellt (4 Bilder eingefügt), siehe unten.
- Diese habe ich meinem VCE-Projekt bekannt gemacht (hinzufügen\vorhandenes Element)
*-> Wie bringe ich ihn jetzt dazu, die mit einzubinden. Meine Idee 'verwaltete Ressourcendatei einbinden' (siehe erster Post) scheint falsch zu sein.
-> Woran erkenne ich managed Source? Erscheint blöd die Frage, aber ich kenne VCE nur so, wie ich es nutze....
-> Ich muß die Bitmaps im Code doch sicher anders einbinden, oder?!
-> Muss ich bei den .h etwas beachten? Funzen die auch unter VCE, braucht er die?!Meine bilder.rc:
// RESOURCE SCRIPT generated by "Pelles C fr Windows, Version 4.50". #include <windows.h> #include <commctrl.h> #include <richedit.h> LANGUAGE LANG_GERMAN,SUBLANG_GERMAN 8001 BITMAP "pic1.bmp" 8002 BITMAP "pic2.bmp" 8003 BITMAP "pic3.bmp" 8004 BITMAP "pic4.bmp"
Sorry, hatte mir das einfacher vorgestellt (wie naiv)
-
Füge die RC Datei in Dein Projekt ein. Wird sie denn kompiliert?
-
Martin Richter schrieb:
Füge die RC Datei in Dein Projekt ein. Wird sie denn kompiliert?
Ähh, ja: Eingefügt habe ich das wie oben beschrieben. Kompilieren tut er auch noch, aber ob die da nun mit drin sind, weiss ich nicht, glaube eher nicht, denn das muss man dem Kompiler doch bestimmt mitgeben, oder nicht?
Die fetten Fragen oben gelten also immernoch...
-
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.
-
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!!!
-
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.
-
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.
-
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.