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

1

12.12.2006, 09:39

Probleme mit OPENFILENAME

Hallo, hab mal wieder ein Problem und zwar folgendes:

In meinem Programm lassen sich über eine ComboBox verschiedene Effect Files auswählen. Die werden auch korrekt geladen und eigentlich funktioniert das Ganze so wie es soll.
Nun gibt es aber auch noch die Möglichkeit über OPENFILENAME und GetOpenFileName verschiedene Texturen auszuwählen. Auch das funktioniert eigentlich wunderbar.
Sobald ich allerdings einmal die Dialogbox zum wechseln der Textur aufgerufen habe lassen sich die EffectFiles nicht mehr laden.
Dazu muss gesagt werden, dass das GAnze auch nur dann passiert, wenn der "öffnen" Button gedrückt wird. Bei Abbrechen lassen sich die Shader auch noch weiterhin laden.
Die Dialogbox verändert im Hintergrund wohl irgendwas, was meinem Effektfile nicht passt. Das gleiche passiert auch mit einem Ifstream, der ebenfalls nicht mehr funktioniert.
Die Funktionen für das GetOpenFileName sehen folgendermaßen aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void LoadMap (HWND hwnd)
{
// welche Dateitypen sollen ausgewählt werden können

    static TCHAR DateiFilter[] =    TEXT ("Alle Dateien (*.*)\0*.*\0\0")\
                                    TEXT ("Bitmap (*.BMP)\0*.bmp\0") \
                                    TEXT ("Targa (*.TGA)\0*.tga\0") \
                                    TEXT ("PNG (*.PNG)\0*.png\0");
                                    

   ZeroMemory(&file, sizeof(OPENFILENAME));
   file.lStructSize = sizeof (OPENFILENAME);
   file.hwndOwner = hwnd;
   file.hInstance = NULL;
   file.lpstrFilter = DateiFilter;
   file.lpstrCustomFilter = NULL;
   file.nMaxCustFilter = 0;
   file.nFilterIndex = 0;
   file.lpstrFile = NULL; 
   file.nMaxFile = MAX_PATH;
   file.lpstrFileTitle = NULL; 
   file.nMaxFileTitle = MAX_PATH;
   file.lpstrInitialDir = NULL;
   file.lpstrTitle = NULL;
   file.Flags = 0; 
   file.nFileOffset = 0;
   file.nFileExtension = 0;
   file.lpstrDefExt = TEXT ("bmp");
   file.lCustData = 0L;
   file.lpfnHook = NULL;
   file.lpTemplateName = NULL;
}

BOOL CreateDialog (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
   file.hwndOwner = hwnd;
   file.lpstrFile = pstrFileName;
   file.lpstrFileTitle = pstrTitleName;
   file.Flags = OFN_HIDEREADONLY;
    

    return GetOpenFileName (&file);
}



So sieht der Code aus, der sich anschließend aus irgendeinem Grund nicht mehr ausführen lässt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if(FAILED(temphr = D3DXCreateEffectFromFile(    pDirect3DDevice,  //Shader laden

                                                    c_shaderPfad,
                                                    NULL,
                                                    NULL,
                                                    NULL,
                                                    NULL,
                                                    &pEffect,
                                                    &pBufferErrors)))
     {
         g_pLogfile->fTextout(RED,"Fehler beim Laden des Shaders (->Konstruktur Shader.cpp)");
         MessageBox(NULL,"Fehler beim Laden des Shaders","Fehler",MB_OK);
         status=false;
     }

     if(!FAILED(temphr))
     {
         char buffer[256]={"\0"};
         ifstream In(c_shadertxt,NULL);
         if(In!=NULL)
         {
             while(In.getline(buffer,256,'\n'))
                 v_ObjectShader.push_back(buffer);
             g_pLogfile->FunctionResult("Shader(TxT) eingelesen",L_OK);
         }
         else g_pLogfile->fTextout(RED,"Fehler beim Laden des zugehörigen TxtFiles (->Konstruktur Shader.cpp)");
     }


Wie gesagt alles funktioniert unabhängig von einander und eigentlich tadellos, nur wenn der Dialog zum Auswählen einer Textur geöffnet wird und eine Textur mit öffnen ausgewählt wir bekomme ich das Ergebnis. Ich verwende den Dialog auch noch für andere Fälle, aber auch dort dsa gleiche Ergebnis. Aus meiner Sicht liegt es definitiv irgendwo an dem Dialog, msdn konnte mir leider nicht wirklich weiterhelfen.

Ich hoffe jemand kann mir einen Tipe geben

Gruß

falcon

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

2

12.12.2006, 13:40

Tjo, fiese Geschichte, hatte ich auch schon meinen Spaß mit. OpenFileName setzt dummerweise bei 'Öffnen' das Ausführungsverzeichnis auf das Verzeichnis, aus dem die Datei ausgewählt wurde. Anschließend funktionieren deshalb alle relativen Pfade nicht mehr. Da hilft nur vorher GetCurrentDirectory und danach SetCurrentDirectory, dann hast du wieder dein korrektes Ausführungsverzeichnis.

3

12.12.2006, 14:56

Hallo CodingCat

Super, vielen Dank.
Scheint nun echt zu funktionieren.

Gruß

falcon

Werbeanzeige