当使用OPENFILENAME结构和GetSaveFileName()时,是否有任何方法可以使SOMETHING自动将选



我有这个函数:

void PickupFileAndSave(std::vector<unsigned char> file_data, int *error_code, char *file_mask = "All files (*.*)*.*")
{
    OPENFILENAMEA ofn;       // common dialog box structure
    char szFile[MAX_PATH];   // buffer for file name
    char initial_dir[MAX_PATH] = { 0 };
    GetStartupPath(initial_dir);
    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = GetActiveWindow();
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '' so that GetOpenFileName does not 
    // use the contents of szFile to initialize itself.
    ofn.lpstrFile[0] = '';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = file_mask;
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = initial_dir;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER;
    if (!GetSaveFileNameA(&ofn))
    {
        *error_code = GetLastError();
        return;
    }
    char err_msg[1024] = { 0 };
    std::string file_name = ofn.lpstrFile; //this stores path to file without extension
    file_name.append(".");
    file_name.append(ofn.lpstrDefExt); //this is NULL and fails to copy too
    WriteAllBytes(file_name.c_str(), &file_data[0], file_data.size(), &err_msg[0]);
    if (strlen(err_msg) > 0)
    {
        *error_code = GetLastError();
        return;
    }       
}

我这样称呼它:

int write_error = 0;
PickupFileAndSave(compressed, &write_error, "RLE compressed files (*.rle)*.rle");

当我选择文件时,它显示在过滤器所需的扩展名中,但不要将其添加到lpstrFile中。

有什么想法为什么以及如何修复它吗?

您没有分配lpstrDefExt,因此系统不会在您省略扩展的情况下添加它。因此,您只需要在显示对话框之前初始化字段:

lpstrDefExt = "rle";

文档对此进行了解释:

lpstrDefExt

默认扩展名。如果用户未能键入扩展名,GetOpenFileName和GetSaveFileName会将此扩展名附加到文件名中。此字符串可以是任何长度,但只追加前三个字符。字符串不应包含句点(.)。如果此成员为NULL并且用户未能键入扩展名,则不会附加任何扩展名。


从问题中的代码中还不清楚,但您希望处理有多个筛选器的情况,并且希望附加所选筛选器的扩展名。

系统不会为您执行此操作,因此您必须执行此操作。显示对话框后,请阅读nFilterIndex。这告诉您用户选择了哪个过滤器。然后解析过滤器字符串以获得所选的扩展名,如果没有扩展名,则将其附加到文件名中。

相关内容

最新更新