2016-05-29 5 views
0

私はeditBoxをシミュレートするためにSDL2を使用してC++アプリケーションを作成しました。 Windowsエクスプローラでファイルを開いて選択する機能を追加するまでは、問題なく動作しました。GetOpenFileName with SDL2

私はファイルブラウザ上で「開く」をクリックし正確にした後、私はもう)(TTF_OpenFontを使用することはできません...

私はまだ私は初期化時に宣言しているTextSpritesを使用することですが、私は変更することはできません。それらの文字列はもはやそれらに関連付けられません。 editBoxがメインループに文字列varを表示する必要があるので、それは本当に面倒です。 私はすでにフォントパスをデバッグブレークポイントでチェックしていますが、変更はありません(同じ絶対パス)やフォントサイズは変わりません。

私はこの問題を解決するために多くのことを試しました。他の.ttfを使用し、別のTTF_Font * varを使用してください。 また、openfiledialog関数を別のスレッドに入れてみました。新しいスレッドをWindowsのイベントで制御してからSdl_Eventで制御するが、運がない。 私は明らかに似たような問題についてウェブを検索して何時間も何時間もテストしたが、未解決の投稿以外は何も見つからなかった。

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; 
} 

そして、私のTextSpriteに表示されたテキストに変更するために使用1:最後に

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; 
} 

をここで

は私が開いたファイルの名前を取得することができます目的球であります私は自分のプロジェクトにWxWidgetを追加してwxFileDialogを使って問題を解決するかどうかを考えてみましたが、SDL2とwxWidgetを混ぜ合わせることは冗談です:-(

anyb oOdyはGetOpenFileName()でファイルを選択して開いた後、なぜtt_fontを再び開くことができないのか知っていますか?

これを解決する可能性がありますか?この下

答えて

1

コメントMSDN pageの機能事前に

おかげであなたが記述している正確に何である、「ファイルを開いたときに現在の作業ディレクトリが変更された」と言います。 SetCurrentDirectory(起動時にGetCurrentDirectoryというクエリを1回)で元に戻してください。

もう1つの方法は、頻繁にフォントを使用しているため、フォントを閉じないことです。

+0

おかげでケルトの束!元のディレクトリを元に戻すのはやりました。私が思い出したように、文字列の各変更後にフォントを閉じて再オープンすることにしたので、起動後1分ほどプログラムがクラッシュすることはありません。それは笑、もう一度ありがとう、働いているので、私はこれのように保つよ! –

関連する問題