JPG laden mit GDI+



  • Gut, wenn ich

    Status::
    

    weglasse, dann lässt sich das Programm immerhin starten. Danke dafür. Ein Bild wird allerdings immer noch nicht angezeigt.

    Weder das Bild, noch der durch

    std::cout
    

    eigentlich ausgegebene Text!?

    Auch wenn ich unabhängig von meiner "if / else" Verschachtelung mit cout einen Text ausgeben will, tut sich nichts auf dem Bildschirm. Ich muss doch, um mit cout den Text ausgeben zu können einfach nur

    #include <iostream>
    

    mit einbinden, das müsste doch reichen, oder was muss ich ändern damit der Text angezeigt werden würde?

    Meine OnPaint-Methode habe ich, da ich sie mit

    afx-Msg void OnPaint();
    

    in meiner von CView abgeleiteten Klasse überschrieben habe. Das müsste doch so stimmen, funktioniert ja auch. Daran kann es also wahrscheinlich nicht liegen.

    Danke an alle meine Unterstützer, nur nicht die Nerven verlieren :-),

    Fabian



  • Setz doch mal einen Breakpoint rein und schau ob die Methode überhaupt aufgerufen wird.

    Eines von den beiden Bedingungen des ifs muß ja aufgerufen werden.



  • Entschuldigung, aber wie setze ich einen Breakpoint?



  • Du hast noch viel zu lernen...

    Setze den Cursor in die if-Zeile mit dem GetLastStatus() und drücke die Taste F9. Dann lässt du das Programm laufen (mit F5) und wenn die pikante Stelle aufgerufen werden sollte, müsste der Debugger erscheinen. Dann einfach immer mit F10 weiter durch laufen lassen und schauen wie der Programmablauf ist.

    Estratu hat auch im C++ Magazin einen ausführlichen Artikel über Debuggen geschrieben:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html

    Undbedingt durchlesen!



  • Achja, die cout hat ein Problem: die Ausgabe erscheint so nirgens... du mußt die Konsole einschalten. Hier eine Datei die ich für meine Projekte erstellt habe:

    Console_cpp.zip

    Einmalig zum Programmstart redirectConsole() aufrufen, z.B. in CMyApp::InitInstance(), dann erscheint beim Debug eine Konsole wo cout-Ausgaben drauf erscheinen. Wenn du eine Release-Version erstellst (also für Enduser) wird die Konsole nicht geöffnet, sondern eine Logdatei cout.txt erstellt und dort werden die Ausgaben reingeschrieben.



  • Da das mit dem cout nicht funktionierte, habe ich mir eine CString variable erstellt, dann image.GetLastStatus() als integer abgespeichert und anschließend in meine CString variable konvertiert.
    Dadurch konnte ich mir das Ergebnis von GetLastStatus über TextOut() anzeigen lassen:

    void CJpgs_laden_MFCView::OnPaint()
    {
    
    	CPaintDC dc( this );
    	Graphics graphics(dc.GetSafeHdc());
    
    	Image image(L"Winter.jpg");
    
    	CString mein_Status;
    	int c = image.GetLastStatus();
    
    	mein_Status.Format("%i", c);
    
    	if (image.GetLastStatus() == 0)	{
    	graphics.DrawImage(&image, 0, 0);
    	dc.TextOut(40, 100, mein_Status);
    	dc.TextOut(40, 200, "Bild wird geladen");
    	}
    
    	else	{
    	dc.TextOut(40, 100, mein_Status);
    	dc.TextOut(40, 200, "Bild wird nicht geladen");
    	}
    
    }
    

    So, das verwirrende ist, dass die Rückmeldung in if(... == Ok) immer True ist und mein Programm somit gar nicht erst in die else-Schleife springt.
    Wenn ich mir jetzt aber in der if-Schleife den Rückgabewert von GetLastStatus() auf dem Bildschirm anzeigen lasse, erhalte ich folgendes Ergebnis:

    3

    Das bedeutet doch eigentlich, dass das Bild nicht geladen werden konnte. Trotzdem ist der Wert in der if(Bedingung) immer 0.

    Es macht übrigens auch gar keinen Unterschied, ob ich nun mit (L"Winter.jpg") dieses vorhanden Bild lade oder ein random-Bild, das gar nicht existiert.
    Und dennoch bleibt der Rückgabewert in meiner if-Schleife für GetLastStatus() immer Ok und der Wert, den ich danach auf dem Bildschirm ausgegeben bekomme immer 3.

    Wie kann ich das verstehen?

    Vielen Dank,

    Fabian



  • Sehr komisch. Status 3 heißt eigentlich OutOfMemory. Klingt doof, aber hast du genug Hauptspeicher frei? Wie groß ist das Bild, das du laden willst? (breite x höhe)



  • In der Msdn Library steht unten nach der Angabe der Bedeutungen aller Ziffern noch, dass 3 auch für alle anderen Arten von Problemen angezeigt wird, wenn sich das Bild nicht laden lässt. D.h. es muss gar nichts mit Speicherplatzmangel o.ä. zu tun haben.
    Ich versuch jetzt einfach weiter, irgendwann muss es ja klappen!

    Vielen Dank für alle Hilfe,

    Fabian



  • So, ich habe jetzt nochmal in einem neuen Projekt von vorne begonnen. Ich weiß zwar nicht was ich jetzt anders gemacht habe, dennoch klappt es nun, das Bild zu laden 🙂 !

    Vielen Dank nochmal an Artchi und CTecS für die klasse Unterstützung!

    Gruß,

    Fabian



  • Vergleiche mal in deinem alten Projekt und auf deiner Festplatte, ob die Datei, die du öffnen wolltest auch wirklich im angegebenen Pfad liegt. Ich hatte mich da auch selbst reingelegt, is ja aber auch sowas von logisch, dass 'Out of Memory' 'File not found' bedeutet.... 😉


Anmelden zum Antworten