2015-06-20 54 views
3

我創建一個OPENFILENAME:GetOpenFileName()是插手SFML

OPENFILENAME ofn; 
char szFile[260];  
HWND hwnd = NULL;    

// Initialize OPENFILENAME 
ZeroMemory(&ofn, sizeof(ofn)); 
ofn.lStructSize = sizeof(ofn); 
ofn.hwndOwner = hwnd; 
ofn.lpstrFile = (LPWSTR)szFile; 
ofn.lpstrFile[0] = '\0'; 
ofn.nMaxFile = sizeof(szFile); 
ofn.lpstrFilter = L"PNG Files\0*.PNG*\0"; 
ofn.nFilterIndex = 1; 
ofn.lpstrFileTitle = NULL; 
ofn.nMaxFileTitle = 0; 
ofn.lpstrInitialDir = NULL; 
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 

std::string input; 
if (GetOpenFileName(&ofn)) 
{ 
    input = CW2A(ofn.lpstrFile); 
    std::cout << input << std::endl; 
} 
else 
    errorHandle("Open Dialog Problem"); 

但是當我嘗試通過SMFL進口的東西它說: 「錯誤:無法打開文件」:

sf::Texture _cursor; 
    if (!_cursor.loadFromFile("Resources/Metal_Norm.png")) 
     errorHandle("-Cursor Texture Couldn't Load"); 

不知道爲什麼這個錯誤發生,如果任何人有任何可能的答案,我將不勝感激。

+2

'char szFile [260]; ofn.lpstrFile =(LPWSTR)szFile;'這是非常錯誤的,並且等待發生緩衝區溢出。使用類型轉換來編譯代碼應該已經引發了一個紅旗,說明你做錯了什麼。將'char szFile [260];'更改爲'WCHAR szFile [MAX_PATH + 1];','ofn.nMaxFile = sizeof(szFile);'to'ofn.nMaxFile = MAX_PATH;',並去掉這個類型轉換。或者你可以使用'GetOpenFileNameA()'來代替'CW2A()'。 –

回答

6

GetOpenFileNamechanges the current directory當您在瀏覽器中瀏覽時。

有一個標誌,你可以設置,OFN_NO­CHANGE­DIR這應該是爲了防止這一點,但我注意到MSDN docs已被更新在某個時候說它不適用於GetOpenFileName

你可以試試,但如果它是真的,它不起作用,解決方法是在調用GetOpenFileName之前保存當前目錄(使用GetCurrentDirectory),然後使用SetCurrentDirectory進行恢復。

+0

哇!你是一個非常棒的人,我只是測試了你的理論,並且爲了上帝的愛而工作。謝謝你,你是一個拯救生命的人,我永遠不會知道這一點。 –

+0

@ShawnSpitz很高興能幫到您:) –

+3

您真正需要做的就是停止在gui應用中使用工作目錄。這是不可預測的。沒有理由,它應該是包含exe文件的目錄。 –

0

我做了什麼來解決這個問題,喬納森·波特的幫助:

1)保存的SFML應用程序的當前目錄。

LPCWSTR mainDirectory = GetCurrentD(); 

2.)我做了什麼與GetOpenFileName()函數。

Tilemap t(file.GetWindowWidth(), file.GetWindowHeight(), file.GetTileWidth(), file.GetTileHeight(), file.GetScale(), file.GetTop(), OpenFile()); 

3.)然後將目錄恢復到我保存的原始起始目錄。

if (!SetCurrentDirectory(mainDirectory)) 
    errorHandle(L"Didn't Set Directory");