Как подключить событие к CFileDialog? - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь создать диалоговое окно «Сохранить как» с событием, которое изменит путь по умолчанию в зависимости от типа файла, который мы выбираем из поля со списком фильтров.Проблема в том, что все примеры, которые я видел, исполняют код для результата IDOK или IDCANCEL, в то время как мне нужно, чтобы код выполнялся, пока диалог все еще открыт.

Кроме того, есть ли способ отличить, какой фильтр был выбран, если фильтры имеют одинаковый тип?Метод GetFileExt() просто возвращает расширение, но я не могу сказать, был ли это первый фильтр .my или шаблон .my.

Я видел что-то вроде LPOFNHOOKPROC, но не былопример того, как бы я его использовал, и я не уверен, решит ли это мою проблему или нет.

void CMyClass::OnFileOpen()
{
   CString pathNam;
   CString fileName;

   TCHAR szFilters[]= _T("MyType Files (*.my)|*.my|"Template MyType (*.my)|*.my||");

   CFileDialog fileDlg(TRUE, _T("my"), _T("*.my"),
   OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);

   if(fileDlg.DoModal() == IDOK)
   {
       pathName = fileDlg.GetPathName();
       fileName = fileDlg.GetFileTitle();
   }
}

РЕДАКТИРОВАТЬ:

Теперь я могу получить определенный фильтрэто было выбрано путем получения OFN и проверки значения nFilterIndex.Таким образом, остающаяся проблема заключается в том, могу ли я обновить путь на основе выбранного формата файла?

EDIT2:

Я нашел метод OnChangeType и перегрузил его в подкласс, и он действительновыполняет метод и код внутри, но когда я пытаюсь обновить путь к файлу, я получаю нарушение прав доступа:

void TFileDialogExt::OnTypeChange()
{
   LPWSTR buff = L"C:\\TEST\\template.my";

   if(m_pOFN->nFilterIndex == 2)
      m_ofn.lpstrFile = buff;    
}

1 Ответ

1 голос
/ 01 июля 2019

По сути, вы должны создать подкласс CFileDialog и обработать его CFileDialog::OnTypeChange метод.

Но, как предлагает Microsoft: вам лучше использовать новый Общий элементДиалог вместо.

...