2016-05-29 11 views
0

Ich schrieb eine C++ App mit SDL2, um eine editBox zu simulieren. Es funktionierte ok, bis ich eine Funktion zum Öffnen und Auswählen einer Datei im Windows Explorer hinzugefügt.GetOpenFileName mit SDL2

Gerade nachdem ich „Open“ auf dem Datei-Browser klicken, kann ich nicht verwenden TTF_OpenFont() mehr ...

Ich bin noch in der Lage TextSprites verwenden i bei der Initialisierung deklariert haben, aber ich kann es nicht ändern die Zeichenfolge assoziiert sie nicht mehr. Und das ist wirklich ärgerlich, weil meine editBox eine String-Var in meiner Hauptschleife anzeigen muss. Ich habe bereits meinen Schriftpfad mit Debug-Breakpoints überprüft und es hat sich nicht geändert (immer noch den gleichen absoluten Pfad) noch die Schriftgröße.

Ich habe viele Dinge tryed diese zu lösen: eine andere Ttf verwenden, eine andere TTF_Font * var verwenden, ect tryed auch meine Openfile Funktion in einem separaten Thread gestellt, dass nichts geändert hat, so tryed i steuere den neuen Thread mit Windows Events und dann mit Sdl_Event aber hatte kein Glück. Ich verbrachte offensichtlich stundenlang mit der Suche im Internet nach ähnlichen Problemen und fand nur ungelöste Beiträge.

Hier ist die funtion, die ich den Namen der zu öffnenden Datei erhalten kann:

void CMain::changeDirectoryPath() 
{ 
    OPENFILENAME ofn; 
    TCHAR szFile[MAX_PATH]; 
    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.lpstrFile = szFile; 
    ofn.lpstrFile[0] = '\0'; 
    ofn.hwndOwner = NULL; 
    ofn.nMaxFile = sizeof(szFile); 
    ofn.lpstrFilter = TEXT("Text Files\0*.txt\0Any File\0*.*\0"); 
    ofn.nFilterIndex = 1; 
    ofn.lpstrTitle = TEXT("Select dictionary"); 
    ofn.lpstrInitialDir = L"data\\dictionary"; 
    ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST; 
    if(GetOpenFileName(&ofn)) 
    { 
     OutputDebugString(ofn.lpstrFile); 
     int cSize = WideCharToMultiByte (CP_ACP, 0, ofn.lpstrFile, wcslen(ofn.lpstrFile), NULL, 0, NULL, NULL); 
     string output(static_cast<size_t>(cSize), '\0'); 
     WideCharToMultiByte (CP_ACP, 0, ofn.lpstrFile, wcslen(ofn.lpstrFile), reinterpret_cast<char*>(&output[0]), cSize, NULL, NULL); 
     cout<<output<<endl; 
    } 
    cdpOn = false; 
} 

Und derjenige, der den Text auf meiner TextSprite angezeigt verwendet zu ändern:

bool CDictionary::loadFromRenderedText(std::string textureText) 
{ 
    if(Message!=NULL) 
    { 
     SDL_DestroyTexture(Message); 
     Message = NULL; 
     TTF_CloseFont(font); 
    } 
    font = TTF_OpenFont(filePath.c_str(), policeSize); 
    if(!font) 
    { 
     cout<<"TTF_OpenFont: "<<TTF_GetError()<<endl; 
     return 0; 
    } 
    textSurface = TTF_RenderText_Solid(font, textureText.c_str(), textColor); 
    if(textSurface != NULL) 
    { 
     Message = SDL_CreateTextureFromSurface(renderer, textSurface); 
     if(Message==NULL) 
     { 
      printf("Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError()); 
     } 
     else 
     { 
      position.x=50; 
      position.y=50; 
      position.w=textSurface->w; 
      position.h=textSurface->h; 
     } 
     SDL_FreeSurface(textSurface); 
    } 
    else 
    { 
     printf("Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError()); 
    } 
    return Message != NULL; 
} 

Endlich ich dachte, WxWidget in meinem Projekt hinzuzufügen und wxFileDialog zu verwenden, um zu sehen, wenn es das Problem löst, aber ich habe Angst, SDL2 zu mischen, und wxWidget wird in einem wilden Durcheinander zurückgreifen :-(

Tut anyb Ich weiß, warum ich ein tt_font nicht öffnen kann, nachdem ich eine Datei mit GetOpenFileName() ausgewählt und geöffnet habe.

Oder haben Vorschläge, um dies zu lösen?

Vielen Dank im Voraus

Antwort

1

Kommentar unter diesen Funktionen MSDN page sagt „aktuelles Arbeitsverzeichnis geändert wird, wenn eine Datei geöffnet wird“, das ist genau das, was Sie beschreiben. Stellen Sie es zurück mit SetCurrentDirectory (Abfrage beim Start mit GetCurrentDirectory, einmal).

Eine andere Möglichkeit wäre, die Schriftart nicht zu schließen, da Sie sie häufig verwenden.

+0

Vielen Dank Keltar! Das Zurücksetzen des ursprünglichen Verzeichnisses hat den Zweck erfüllt. Wenn ich mich recht entsinne, habe ich beschlossen, die Schriftart nach jeder Änderung an der Zeichenkette zu schließen und wieder zu öffnen, so dass das Programm nach dem Start nicht um eine Minute abstürzt. Ich behalte es so, weil es funktioniert lol, danke nochmal! –