Я использую OPENFILENAME ofn способ открыть диалоговое окно просмотра файлов в приложении Win32.
Я хочу иметь возможность использовать динамическую фильтрацию файлов в соответствии с потребностями пользователя, а не так, как предопределено для всех файлов
ofn.lpstrFilter = L"All Files\0*.*\0\0";
Я пытался заменить предопределенный код динамическим, но кажется, что даже символ с нулевым символом в конце рассматривается как строка в приведенном ниже коде
string UserChoice = "Exe Files\0*.exe\0\0";
wstring ChoiceTemp = s2ws(UserChoice); // convert string to lpcwstr
LPCWSTR FilterByUser = ChoiceTemp.c_str();
ofn.lpstrFilter = FilterByUser;
Кажется, что \ 0 не распознается как нулевой символ в диалоговом окне просмотра файлов, и он не показывает никаких файлов вообще, мои знания о c ++ находятся на моих первых шагах, и я не могу заставить его работать без какой-либо помощи в этом вопрос, и я искал по сети, но ничего не пригодилось.
Любое предложение о том, как заставить это работать?
lpstrFilter
как правило, постоянная строка, поэтому нет необходимости std::wstring
, Просто определите постоянную строку:
const wchar_t* filter =
L"All files\0*.*\0"L"Exe files\0*.exe\0";
Но при необходимости это можно сделать следующим образом (я повторяю @Joachim Pileborg)
std::wstring filter =
L"All files|*.*|"L"Exe files|*.exe|";
std::replace(filter.begin(), filter.end(), '|', '\0');
ofn.lpstrFilter = filter.data();
использование filter.data()
вместо c_str()
, Для выбора конкретного фильтра используйте nFilterIndex
wchar_t filename[MAX_PATH];
wcscpy_s(filename, L"c:\\test\\default file.txt");
OPENFILENAME ofn = { sizeof(OPENFILENAME) };
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 2; //select "Exe files"ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
Ты можешь использовать std::string
для строк со встроенными терминаторами, но вы должны использовать правильный std::string
конструктор создать строку.
Более конкретно, либо тот, в котором вы явно указываете длину (номер 4 в ссылке на связанный конструктор), либо начальный и конечный итератор (номер 6). В этом случае первый лучше всего:
string UserChoice("Exe Files\0*.exe\0", 16);