Bitmap lädt mittels LoadImage Funktion nicht immer



  • Hey,

    Also das Verzeichnis ändert sich nicht. Es bleibt bei der .bmp Datei, die funktioniert, und bei der, die nicht Funktioniert gleich.

    GetLastError hat die Meldung "Der Vorgang wurde erfolgreich beendet!" gebracht. Entweder nutze ich diese Funktion falsch (GetLastError -> FormatMessage usw.), oder sie ist generell wenig hilfreich. Zumindest meine eigenen Fehlermeldungen sagen da mehr aus.

    Meine einzige Idee wäre momentan wirklich nur, dass LoadImage eventuell nicht mit jedem Bitmap Format klar kommt, denn alle .bmp, die ich mit Paint erstelle funktionieren ja. Nur die Bitmap, die ich mit dem guten Grafik Programm gemacht habe nicht 😃
    Und das öffnen der guten .bmp in Paint und das erneute Speichern dort, bringen leider auch nichts. Wahrscheinlich, weil Paint diese spezielle .bmp dann nicht mehr umformt oder so.

    Fällt noch wem was ein?



  • Hey,

    Das Problem ist gelöst. Es liegt daran, dass LoadImage eine 24 Bit Bitmap erwartet und Corel Photoshop hat einen anderen Bitmaptypen verwendet.


  • Mod

    Paddle schrieb:

    Das Problem ist gelöst. Es liegt daran, dass LoadImage eine 24 Bit Bitmap erwartet und Corel Photoshop hat einen anderen Bitmaptypen verwendet.

    Kann nicht sein. LoadImage lädt so ziemlich alle Bitmapformen.



  • Ich hab es ja ausprobiert. 32 Bit Bitmaps funktionieren aus irgendeinem Grund nicht. Das kann viele Gründe haben. Vielleicht werden die intern wirklich anders gespeichert oder die Bibliothek ist veraltet. Anders kann ich mir das nicht erklären.



  • Ich habe noch nie Probleme mit LoadImage und 32bpp Bitmaps gehabt.
    Hast Du geprüft ob Dir ein gültiges Handle zurückgegeben wird ?
    GetLastError scheint ja "alles OK" zurückzugeben.
    Ich denke eher es liegt an den Funktionen die Du zum Anzeigen der Bitmap verwendest ...

    :xmas1: Grüße
    Greenhorn



  • Hey,

    Ich benutze ja einen selbst programmierten DEBUG Modus, der immer an ist, wenn ich Sachen ausprobiere. Dort frage ich unter anderem sämtliche handles, aber auch andere Funktionen ab. Dort wird zumindest nichts falsches zurückgeliefert. Und der Code ist ja dafür auch nicht so lang. Hier mal Code Ausschnitte:

    WM_CREATE:

    hBMPintro = (HBITMAP) LoadImage(NULL, ".\\graphics\\bm24_bgp.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
          Bytes = GetObject(hBMPintro, sizeof(BITMAP), &BMPintro);
    
          #ifdef DEBUG_MODE
            if (hBMPintro == NULL) MessageBox(WPhwnd, "LoadImage() returns NULL.", "Error", MB_OK);
            if (Bytes == 0) MessageBox(WPhwnd, "GetObject() returns 0.", "Error", MB_OK);
          #endif
    

    WM_PAINT:

    hDeCo                = BeginPaint(WPhwnd, &ps);
            hDeCoMem             = CreateCompatibleDC(hDeCo);
            SelectObject(hDeCoMem, hBMPintro);
            flag                 = BitBlt (hDeCo, 0, 0, BMPintro.bmWidth, BMPintro.bmHeight, hDeCoMem, 0, 0, SRCCOPY) ; 
    
            #ifdef DEBUG_MODE
              if (!flag) MessageBox(WPhwnd, "BitBlt() returns 0.", "Error", MB_OK);
            #endif
    
            flag                 = DeleteDC(hDeCoMem);
    
            #ifdef DEBUG_MODE
              if (hDeCo == NULL) MessageBox(WPhwnd, "BeginPaint() returns NULL.", "Error", MB_OK);
              if (hDeCoMem == NULL) MessageBox(WPhwnd, "CreateCompatibleDC() returns NULL.", "Error", MB_OK);
              if (!flag) MessageBox(WPhwnd, "DeleteDC() returns 0.", "Error", MB_OK);
            #endif
    


  • Also, im Debugger von Visual Studio siehst Du doch den Inhalt der Variablen. Und den Rückgabewert der Funktionen auch. Da brauchst Du Deine Debug-Funktionen eigentlich nicht.

    BTW, den Speicher-Gerätekontext würde ich in der WM_CREATE erzeugen und global speichern und erst bei der WM_DESTROY löschen. Außerdem würde ich die alte Bitmap nach dem BitBlt wieder in den Speicher-Gerätekontext einfügen.

    :xmas2:



  • Hey,

    Ich benutze ja leider kein Visual Studio, sondern Dev C++. Ob der einen Debugger hat weiß ich allerdings nicht. So gesehen schadet der eigene Debugger ja nicht. Das ist zwar einmal mehr Schreibarbeit, aber ich kann gleich für eigene Ausgaben sorgen.

    Den Speicher-gerätekontext in WM_CREATE zu erzeugen ist prinzipiell vielleicht keine schlechte Idee. Aber das zweite verstehe ich nicht ganz. Ich habe ja nicht nur diese eine Bitmap? Welchen Vorteil hätte das?



  • http://msdn.microsoft.com/en-us/library/dd162957%28v=vs.85%29.aspx
    Siehe "Remarks".

    Dev C++ ist tot, von daher empfehle ich Dir VC 2010 Express.
    http://www.c-plusplus.net/forum/143003
    Und das SDK 7.1, falls Du Win7 benutzt.
    http://www.microsoft.com/en-us/download/details.aspx?id=8442

    Grüße
    Greenhorn



  • Paddle schrieb:

    So gesehen schadet der eigene Debugger ja nicht. Das ist zwar einmal mehr Schreibarbeit, aber ich kann gleich für eigene Ausgaben sorgen.

    Die Schreibarbeit kann man sich mit Makros erleichtern. Wird dadurch auch übersichtlicher.
    Bzw. bietet C++ im Header File "cassert" auch schon ein fertiges Makro namens "assert" an.


Anmelden zum Antworten