Bitmap laden - Handle ist 0x0000000000



  • Hallo Zusammen,

    seit Weihnachten sitze ich nun über diesem Problem. Schaue mal in das Tut, schaue mal in ein anderes. Alles verschiedene Lösungen, aber keine hat mich bisher zum Ziel geführt. Ich möchte ein Bitmap zunächst einmal laden und später dann auch anzeigen. Das Ganze soll in einer Dialog-Prozedur geschehen. Was ich in den Tuts gesehen habe ist, dass der ganze Vorgang meistens in der Windowshauptprozedur abgehandelt wird. Das Problem ist jetzt, dass die Funktion LoadBitmap ein NULL-Handle zurückliefert und offensichtlich kein Bitmap findet !!??!! 😞 Wo könnte hier der Fehler liegen. Muss vielleicht das Laden von Bitmaps in der Windowshauptprozedur stattfinden und erst das Anzeigen in der Dialogprozedur?? Bitte helft mir ein bisschen auf die Sprünge, denn so fit in WinApi bin ich leider noch nicht. Danke schon jetzt. Ach so, noch ein bisschen Code: (GetLastError gibt übrigens auch einen vollkommen abstrusen Wert von sich)

    // Dialogprozeduren
    #include <windows.h>
    #include <windowsx.h>
    #include "resource.h"
    
    #include "importiert.h"
    
    // 9. Automatische Verbuchung ausführen
    BOOL CALLBACK DlgProc9 (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        // Lokale Variablen deklarieren
        static  char    buffer[BUFFERGROESSE];
    
        // Globaler Fehlercode/Returncode
        int     retcode     = 0;
        int     retcodeDB   = 0;
        int     nindex      = 0;
    
        // Position
        static HBITMAP  hBitmap ;
        static BITMAP   bitmap ;
        HDC             hdc;
        HINSTANCE       hInstance ;
        PAINTSTRUCT     paintStruct;
        static char *   pszHello = "Hello World!";  
        DWORD           lastError;
    
        switch(message)
        {
            case WM_PAINT:
    
                hdc = BeginPaint(hDlg, &paintStruct);
                TextOut(hdc,
                        0,0,
                        pszHello,
                        lstrlen(pszHello));
    
                EndPaint(hDlg, &paintStruct);
                return TRUE;
    
            case WM_INITDIALOG:
                // Datenbank oeffnen
                hInstance = (HWND) hDlg;
                hBitmap = (HBITMAP) LoadBitmap(hInstance,"IDB_BITMAP2");
                lastError = GetLastError();
                retcodeDB = connectDB();
    
                return TRUE;
            case WM_COMMAND:
                {                               
                    switch (LOWORD(wParam)) // OK / Abbrechen
                    {
                        // OK
                        case IDOK:
                        {
                            retcodeDB = disconnectDB();
                            if(retcodeDB != 0)
                                MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0);
                            EndDialog(hDlg,0);
                            return TRUE;
                        }
    
                        // Cancel
                        case IDCANCEL:
                        {
                            retcodeDB = disconnectDB();
                            if(retcodeDB != 0)
                                MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0);
                            EndDialog(hDlg,0);
                            return TRUE;
                        }
                    } // Switch LOWORD
                } // Switch Message 
        }
        return FALSE; 
    }
    

    Viele Grüße

    Oliver



  • Heisst die Bitmap wirklich "IDB_BITMAP2", also mit den Anführungszeichen, oder eher IDB_BITMAP2? Bei Letzterem musst du das so schreiben:

    LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));

    cya 🙂



  • @MagicCreator,

    Danke für die schnelle Antwort. Hat leider nicht funktioniert. War aber in der Tat Alternative 2 ohne Anführungszeichen. Kann es noch mit was anderem zu tun haben? Mit dem Instanzhandle vielleicht?

    Gruß

    Oliver, der Verzweifelnde



  • Genau, ersetz mal die Zeile:

    hInstance = (HWND) hDlg;
    

    durch die:

    hInstance = GetModuleHandle(0);
    

    oder die:

    hInstance = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);
    

    dann sollte es gehen.

    [ Dieser Beitrag wurde am 29.12.2002 um 18:04 Uhr von D@niel $chumann editiert. ]



  • @Daniel,

    da hast Du doch immer einen guten Tip parat 😉 Aber: GetModuleHandle hat funktioniert, GetWindowLong nicht. Warum?

    Ansonsten muss ich jetzt noch den Fehler 1814 von GetLastError suchen.

    Vielleicht muss ich mich nochmal melden, ansonsten aber schon mal herzlichen Dank auch an MagicCreator.

    Gruß

    Oliver



  • Ich denke mal es war ein Compiler-Fehler, oder?
    Einfach den von GetWindowLong zurückgegebenen long-Wert auf HINSTANCE casten, dann gehts. Ich hab die Zeile in meinem vorigen Posting korrigiert.



  • @Daniel,

    Compiler-Fehler war es nicht, hat einfach so nicht funktioniert. Hast Du noch eine Idee für den 1814 "The specified resource name cannot be found in the image file. ERROR_RESOURCE_NAME_NOT_FOUND". Wenn ich ganz intensiv auf meine Resourcen-Definitionen gucke, dann steht da der Name, wie im Quellcode.

    Gruß

    Oliver



  • Wenn du es so gemacht hast, wie MagiC Creator geschrieben hat, sollte es gehen. Wenn es trotzdem nicht geht, kannst du mir dein Projekt auch gern per Email schicken, dann schau ich es mir mal an. (Daniel-Schumann@web.de)



  • Wenn du noch ein Problem mit Bitmaps hast, kannst du dir ja mal das WinAPI-Tutorial von GermanDevNet anschauen (www.germandevnet.de, unter Knowledgebase).

    cya 🙂



  • @Alle,

    Danke nochmals an Alle, die geholfen haben. Der Dialog läuft jetzt inklusive dem Bitmap und den in die GDI ausgegebenen Texten.

    Gruß

    Oliver


Anmelden zum Antworten