GDI+ funktioniert nach GetOpenFileName() nicht mehr!



  • Ich hatte vor, in eines meiner Programme eine PNG-Datei anzeigen zulassen.
    Hab dann auch noch irgendwo GetOpenFileName() benutzt, doch immer wenn ich die Funktion benutze,
    lässt sich kein weiteres Bild mehr zeichnen!

    Geladen hab ich die PNG mit:

    Graphics grpx(hDC);
    Image *img = Image::FromFile(path, FALSE);
    grpx.DrawImage(img, x, y);
    

    Und dann noch GetOpenFileName():

    char szFile[MAX_PATH];
    char szFileTitle[MAX_PATH];
    szFile[0] = '\0';
    szFileTitle[0] = '\0';
    
    OPENFILENAME ofn;
    
    ZeroMemory(&ofn, sizeof(ofn));
    
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = filter;
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = szFileTitle;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    GetOpenFileName(&ofn);
    


  • Da besteht imho kein Zusammenhang.

    Wann kommt denn dein erstes Codefragment zum Einsatz? Bei jedem Neuzeichnen des Fensters? img wird demnach auch nicht freigegeben (wobei es generell eine schlechte Idee ist, bei jedem Neuzeichnen die Datei einzulesen und neu zu decodieren...



  • weil das arbeitsverzeichnis von GetOpenFileName umgestellt wird



  • Ich würde auch vermuten das dein "path" wohl keine absolute Pfadangabe ist?



  • Danke an alle! 👍

    Das Problem war nun also, dass GetOpenFileName() das Arbeitsverzeichnis änderte!
    Ich habe mit

    Image *img = Image::FromFile("bild.png", FALSE);
    

    eine PNG geladen.
    Diese konnte nach Änderung des Arbeitsverzeichnisses aber nicht mehr gefunden werden und folglich wurde auch nichts angezeigt!
    Ich habe nun vor dem Funktionsaufruf GetCurrentDirectory() benutzt um danach das vorherige Verzeichnis wieder
    mit SetCurrentDirectory() festzulegen.



  • Ich würde lieber den absoluten Pfad zusammenbauen.
    Das current-directory kann schon zu Programmstart unterschiedlich zum Ordner der .exe sein!! (z.B. durch Verknüpfungen)

    int pseudomain()
    {
    	TCHAR filename[MAX_PATH];	// Hier soll der komplette Dateipfad abgelegt werden
    
    	// Kompletten Dateipfad für bild1.png bauen:
    	makeabsfilename(filename,TEXT("bild1.png"));
    
    	// filename anzeigen:
    	MessageBox(NULL,filename,TEXT("test"),MB_OK);
    
    	return 1;
    }
    
    // filename: z.B. 'bla.png'
    // storehere: Enthält anschließend z.B. 'c:\meineapp\bla.png'
    void makeabsfilename(TCHAR* storehere, TCHAR* filename)
    {
    	// Kompletten Pfad der .exe in storehere speichern:
    	GetModuleFileName(NULL, storehere, MAX_PATH);
    	// storehere enthält jetzt z.B. 'c:\meineapp\bla.exe'
    
    	// Letztes '\' in szPathName suchen...
    	LPTSTR pszFileName = _tcsrchr(storehere, '\\') + 1;
    	// ...und alles danach abschneiden:
    	*pszFileName = '\0'; 
    	// storehere enthält jetzt: 'c:\meineapp\'
    
    	// Unseren Dateinamen dranhängen:
    	lstrcat(storehere,filename);	 
    
    	return;
    }
    

    siehe auch: http://www.c-plusplus.net/forum/39131


Anmelden zum Antworten