Forum: PC-Programmierung win32Projekt Bitmap als Ressource einbinden


von Holger74 (Gast)


Lesenswert?

Ich habe im VisualStudio2012 ein win32Projekt und möchte eine Bitmap als 
Ressource in das Programm mit einbinden. Leider funktioniert das nicht 
richtig.

Ich habe eine Datei rescr.rc:
1
#include "resource.h"
2
3
tBild BITMAP "tBild.bmp"

und eine Datei resource.h:
1
#define tBild 201

Geladen werden soll die Bitmap mit:
1
  image= (HBITMAP) LoadBitmap(0, MAKEINTRESOURCE(tBild));

Aber nach dem Aufruf ist image immer noch 0.

Woran liegt das?
Muss bei Ressourcen noch irgendwas am Linker eingestellt werden?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Holger74 schrieb:
> Muss bei Ressourcen noch irgendwas am Linker eingestellt werden?

Natürlich. Die .rc-Datei muss vom Ressourcen-Compiler in eine .res-Datei 
übersetzt werden und diese dann dem Linker vorgeworfen werden, damit er 
sie zum Programm dazupackt.

Wenn Win32-API-Funktionen fehlschlagen, kann man übrigens mit 
GetLastError einen Fehlercode bestimmen, der einen Hinweis darauf 
geben kann, was genau nicht geklappt hat.

Liefert also Dein Aufruf von LoadBitmap NULL, dann könntest Du ja mal 
nachsehen, was GetLastError als Fehlercode liefert.

von Holger74 (Gast)


Lesenswert?

Eine Datei rescr.res wurde angelegt.

GetLastError() liefert:
"Der angebene Ressourcenname wurde nicht in der ImageDatei gefunden"

Ist jetzt der Ressourcenname tbild oder "tbild.bmp" ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mach mal das erzeugte .exe-File im Res(s)ourcen-Editor auf, im Visual 
Studio "File Open", Datei markieren und mit dem Pfeil am "Open"-Knopf zu 
"Open With" gehen und dort den Resource Editor auswählen.

Der zeigt Dir dann an, wie die Dinger tatsächlich heißen.

von Holger74 (Gast)


Lesenswert?

Mit dem ResourcenEditor läßt sich nicht mal die .rc- oder die .res-Datei 
öffnen.

Hab gerade mal externe ResEditoren, wie ResEdit oder ResBuilder benutzt, 
um die Datein zu erstellen, aber das Ergebnis ist immer wieder:

"Der angebene Ressourcenname wurde nicht in der ImageDatei gefunden"

Was die ImageDatei ist? Keine Ahnung!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Holger74 schrieb:
> Mit dem ResourcenEditor läßt sich nicht mal die .rc- oder die .res-Datei
> öffnen.

Dann machst Du da was grundlegendes falsch -- oder MS hat den 
Resourceneditor kaputtgemacht (Du verwendest VS2012, ich nutze VS2010 
und habe davor praktisch jede Vorgängerversion der letzen 20 Jahre 
verwendet).

Holger74 schrieb:
> GetLastError() liefert:
> "Der angebene Ressourcenname wurde nicht in der ImageDatei gefunden"

GetLastError liefert eine Fehlernummer. Die hast Du übersetzt?


Oder könnte es sein, daß Du (wie so viele andere auch) auf die 
Microsoft-Verschleierung hereingefallen bist und weder in C noch in C++, 
sondern in einer .Net-Sprache programmierst? Nein, "C++/CLI" ist NICHT 
C++.

von Holger74 (Gast)


Lesenswert?

Nein das ist ganz sicher kein .net-Projekt!

Ja, ich habe die Fehlermeldung übersetzt.
Hab auch grad ein neues Projekt mit VS2008 erstellt. Aber es kommt immer 
wieder das gleiche.

Wenn ich die .exe mit "ResourceBuilder" öffne, dann wird die Bitmap 
angezeigt.

Die .rc sieht jetzt so aus:
[g]
// Generated by ResEdit 1.5.11
// Copyright (C) 2006-2012
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Bitmap resources
//
LANGUAGE 0, SUBLANG_NEUTRAL
IDB_BITMAP1        BITMAP         "bitmap2.bmp"
[/g]

die resource.h :
[g]
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDB_BITMAP1                             100
[/g]

Und eigentlich muss die .rc doch nur unter RessourcenDatein in das 
Projekt eingefügt werden?

Wie machst Du das normalerweise?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mit VS2008 aber spätestens solltest Du in der Lage sein, Dein .exe-File 
im Resourceneditor zu öffnen.

von Holger74 (Gast)


Angehängte Dateien:

Lesenswert?

Der Ressourceneditor wird gar nicht angeboten.

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

So sieht so etwas bei einem funktionierenden Visual Studio 2010 aus.

Könnte es sein, daß Du eine Express-Version verwendest, und die keinen 
Resourceneditor enthält?

von Holger74 (Gast)


Lesenswert?

ja

von Holger74 (Gast)


Angehängte Dateien:

Lesenswert?

Laut ResourceBuilder ist die Bitmap schon in der .exe vorhanden.

von bluppdidupp (Gast)


Lesenswert?

Muss der 1. Parameter von LoadBitmap() nicht gesetzt werden?
Ich dachte der dürfte nur für die "predefined bitmaps" NULL/0 sein?

von Holger74 (Gast)


Lesenswert?

Stimmt, bluppdidupp.

Vielen Dank, für Deine Geduld, Rufus.

Jetzt funktioniert es.

Mit:
 image= (HBITMAP) LoadBitmap(GetModuleHandle(NULL), 
MAKEINTRESOURCE(ID_BITMAP));

statt:
image= (HBITMAP) LoadBitmap(0, MAKEINTRESOURCE(ID_BITMAP));

Die Lösung habe ich hier:

http://www.c-plusplus.de/forum/183294-full

gefunden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Holger74 schrieb:
> Vielen Dank, für Deine Geduld, Rufus.

Tut mir leid, daß ich den Aufruf von LoadBitmap nicht selbst untersucht 
hatte, aber dazu hatte ich heute wg. Nervkram und Stress im Büro einfach 
keine Ruhe; manchmal muss ich auch zum Geldverdienen arbeiten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.