Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Korowai

unregistriert

1

29.06.2016, 23:26

WINAPI LoadImage() lädt das bmp nicht

Hi,

folgender Code funktioniert nicht. Das bmp ist 24 Bit und im angegebenen Verzeichnis. Der Handle gibt 0 zurück.
IDE: code:blocks.

[code]
BOOL CALLBACK RaumkarteProc(HWND hDlg30, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HDC hdcRaumkarteMem;
RECT rect;
static HBITMAP hRaumkarte;
static BITMAP Raumkarte;

static HWND hwndRaumkartebmp, hwndRaumkarteAktion1, hwndRaumkarteaktion2,
hwndRaumkarteHScroll, hwndRaumkarteVScroll;

switch (message)
{
case WM_INITDIALOG:
{

hRaumkarte= (HBITMAP)LoadImage(NULL,TEXT("C:\\Daten\\...Raumkarte.bmp"),IMAGE_BITMAP,0,0,
LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION);

if (hRaumkarte==NULL)
{
MessageBox(hDlg30,"Raumkarte konnte nicht geladen werden","Error",0);
return TRUE;
}

GetObject(hRaumkarte, sizeof (BITMAP), &Raumkarte);


return FALSE;
};
[/code]

Hat jemand eine Idee?

2

30.06.2016, 00:35

Zitat

If the function succeeds, the return value is the handle of the newly loaded image.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.


Was liefert GetLastError zurück?

Korowai

unregistriert

3

30.06.2016, 08:02

Rückgabewert ist 0: Function successful

???

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

30.06.2016, 08:16

An welcher Stelle in deinem Code hast du denn GetLastError aufgerufen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

30.06.2016, 08:40

Worauf Sylence hinaus will: Du solltest GetLastError unmittelbar nach dem Aufruf von LoadImage aufrufen, nicht etwa nach MessageBox oder GetObject. Diese setzen den Fehlercode nämlich zurück. (Das ist das Dumme an der WinAPI - keine Exceptions!)

PS: Spieleentwicklung direkt mit der WinAPI ist sehr mühsam, möchtest du nicht lieber etwas anderes wie z. B. SFML benutzen?

Korowai

unregistriert

6

30.06.2016, 09:11

Hi,

code so eingefügt:

[cpp]
case WM_INITDIALOG:
{

hRaumkarte= (HBITMAP)LoadImage(NULL,TEXT("Raumkarte.bmp"),IMAGE_BITMAP,0,0,
LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION);

DWORD dLastError=GetLastError();
LPCTSTR strErrorMessage=NULL;

FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ARGUMENT_ARRAY|FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dLastError,0,(LPTSTR) &strErrorMessage,0,NULL);
OutputDebugString(strErrorMessage);


if (hRaumkarte==NULL)
{
MessageBox(hDlg30,"Raumkarte konnte nicht geladen werden","Error",0);
return TRUE;
}

GetObject(hRaumkarte, sizeof (BITMAP), &Raumkarte);


return FALSE;
};



[/cpp]

Erhalte aber keine explizite Fehlermeldung in der Konsole.

Ich möchte zunächst die winAPI lernen. Parallel habe ich sowieso noch genügend c++ zum lernen.

Danke,
Chris

Korowai

unregistriert

7

30.06.2016, 09:33

Nachtrag:

habe das bmp mit Paint geöffnet und neu abgespeichert. Jetzt nimmt der code es an. Darstellung funktioniert zwar nicht, aber die interne Fehlerschleife wird nicht mehr ausgeführt.

Ich habe das bmp mit Gimp erstellt. Vielleicht liegt es daran.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

30.06.2016, 09:41

Evtl. auch im falschen Format abgespeichert.

if-Schleifen gibt es übrigens nicht.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Korowai

unregistriert

9

30.06.2016, 10:39

Hi,

leider noch ein Problem.

Ich habe folgende Ressource im Dialog:

[cpp]
LANGUAGE 0, SUBLANG_NEUTRAL
IDD_DIALOG30 DIALOG 0, 0, 1000, 600
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Raumkarte"
FONT 8, "Ms Shell Dlg"
{
CONTROL "", ID_RAUMKARTE31, WC_STATIC, SS_BLACKFRAME, 201, 0, 800, 600, WS_EX_ACCEPTFILES
SCROLLBAR ID_SCROLLBARVER32, 202, 2, 19, 186, SBS_VERT, WS_EX_LEFT
SCROLLBAR ID_SCROLLBARHOR33, 222, 2, 214, 15, 0, WS_EX_LEFT
LISTBOX ID_RAUMKARTEAKTIONSLISTE34, 1, 0, 198, 183, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
LISTBOX ID_RAUMKARTEWAHLAKTIONSLISTE35, 1, 187, 198, 188, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
}
[/cpp]

Der Control "ID_RAUMKARTE31" hat den Identifier 3001.

An den möchte ich das bmp zur Darstellung senden. Das mit folgendem Befehl:

SendMessage(GetDlgItem(hDlg30,3001),BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hRaumkarte);

Das sieht so aus:
[code]
BOOL CALLBACK RaumkarteProc(HWND hDlg30, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HDC hdcRaumkarteMem;
RECT rect;
static HBITMAP hRaumkarte;
static BITMAP Raumkarte;

static HWND hwndRaumkartebmp, hwndRaumkarteAktion1, hwndRaumkarteaktion2,
hwndRaumkarteHScroll, hwndRaumkarteVScroll;

switch (message)
{
case WM_INITDIALOG:
{

hRaumkarte= (HBITMAP)LoadImage(NULL,TEXT("C:\\Daten\\chris\\Code\\Sucher1_2\\Raumkarte.bmp"),IMAGE_BITMAP,0,0,
LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION);

if (hRaumkarte==NULL)
{
MessageBox(hDlg30,"Raumkarte konnte nicht geladen werden","Error",0);
return TRUE;
}

GetObject(hRaumkarte, sizeof (BITMAP), &Raumkarte);
SendMessage(GetDlgItem(hDlg30,3001),BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hRaumkarte);



return FALSE;
};
[/code]

Aber es kommt nix an. Da hRaumkarte != NULL sollte auch was ankommen, ansonsten würde ja die MessageBox aktiviert.

Also sollte der Fehler woanders liegen. Hat jemand einen Tipp?

Danke,
Chris

Korowai

unregistriert

10

01.07.2016, 07:30

Problem gelöst. Danke

Werbeanzeige