【问题标题】:GetOpenFileName() Is Interfering With SFMLGetOpenFileName() 正在干扰 SFML
【发布时间】:2015-09-06 04:59:03
【问题描述】:

我创建了一个 OPENFILENAME:

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");

如果有人有任何可能的答案,我将不胜感激。

【问题讨论】:

  • char szFile[260]; ofn.lpstrFile = (LPWSTR)szFile; 这是非常错误的,等待发生的缓冲区溢出。使用类型转换来编译代码应该会引发你做错了什么的危险信号。将char szFile[260]; 更改为WCHAR szFile[MAX_PATH+1];,将ofn.nMaxFile = sizeof(szFile); 更改为ofn.nMaxFile = MAX_PATH;,并摆脱类型转换。或者您可以改用GetOpenFileNameA(),并删除CW2A()

标签: c++ windows winapi visual-c++ sfml


【解决方案1】:

GetOpenFileName changes the current directory 在浏览器中导航。

您可以设置一个标志 OFN_NO­CHANGE­DIR,它应该可以防止这种情况发生,但我注意到 MSDN docs 已在某些时候更新,表明它不适用于 GetOpenFileName

您可以尝试这样做,但如果它确实不起作用,解决方案是在调用GetOpenFileName 之前保存当前目录(使用GetCurrentDirectory),然后使用SetCurrentDirectory 恢复它。

【讨论】:

  • 哇!你是一个了不起的人,我刚刚测试了你的理论,看在上帝的份上,它奏效了。谢谢你,你是我永远不会想到的救生员。
  • @ShawnSpitz 很高兴我能帮上忙 :)
  • 您真正需要做的是停止在 gui 应用程序中使用工作目录。这是不可预测的。完全没有理由认为它应该是包含 exe 文件的目录。
  • @JonathanPotter:我从未见过OFN_NO­CHANGE­DIR 不工作。它与您的解决方法相同。它不会阻止 CWD 在导航时更改。它会在对话框关闭之前恢复原始 CWD。​​span>
  • @RemyLebeau:什么,你的意思是 MSDN 有什么问题?天哪! ;)
【解决方案2】:

我在 Jonathan Potter 的帮助下解决了这个问题:

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 2015-02-09
    • 2012-07-17
    • 2019-06-17
    • 2015-02-12
    • 2011-04-02
    • 2020-04-01
    • 2017-08-27
    相关资源
    最近更新 更多