Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Пример из MSDN


Автор: Darked 23.6.2005, 14:25
Всем привет.
В MSDN при описании класса CFileDialog в описании метода DoModal приведен такой пример:
Код

void CChildFrame::OnFileOpen() 
{
   // szFilters is a text string that includes two file name filters:
   // "*.my" for "MyType Files" and "*.*' for "All Files."
   char CChildFrame::szFilters[]=
      "MyType Files (*.my)|*.my|All Files (*.*)|*.*||";

   // Create an Open dialog; the default file name extension is ".my".
   CFileDialog fileDlg (TRUE, "my", "*.my",
      OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
   
   // Display the file dialog. When user clicks OK, fileDlg.DoModal() 
   // returns IDOK.
   if( fileDlg.DoModal ()==IDOK )
   {
      CString pathName = fileDlg.GetPathName();
   
      // Implement opening and reading file in here.
      ...
      //Change the window's title to the opened file's title.
      CString fileName = fileDlg.GetFileTitle ();
   
      SetWindowText(fileName);
   }

}


Мне интересно почему char CChildFrame::szFilters[]="MyType Files (*.my)|*.my|All Files (*.*)|*.*||"; определена так? Что говорит такое объявление строки? Есть соображения?

Автор: Earnest 23.6.2005, 15:03
Это просто соглашение MFC:
Описание фильтра - это пары строк, разделенные символом '|'. Первая подстрока пары - описание, которое появится в списке "Тип файла", вторая - маска.
В конце все это дело должно завершаться '||'.
Вообще-то Windows API требует, чтобы подстроки фильтров отделялись друг от друга NULL, а в конце всей строки хочет видеть NULL NULL. Но попробуйте создать такую строку в ресурсах. Вот, видимо, разработчики MFC и прикрутили такой костылек.

Автор: Darked 23.6.2005, 15:08
Earnest, меня не интересует сам фильтр, меня интересует почему так переменная объявлена:
Код

char CChildFrame::szFilters[]=
      "MyType Files (*.my)|*.my|All Files (*.*)|*.*||";

а не так:
Код

char szFilters[]=
      "MyType Files (*.my)|*.my|All Files (*.*)|*.*||";

Автор: Любитель 23.6.2005, 15:49
А потому что хотелось типа неаглядней... smile

Автор: Earnest 23.6.2005, 16:43
Darked, извини, не заметила. Действительно странно. Разве так можно писать? Переменная вроде как автоматическая, а квалифицируется именем класса...
Теперь мне тоже стало интересно - если это, конечно, не косяк.

Автор: chaos 24.6.2005, 08:03
да инетесно, я даже и не видел такого))
я обычно делаю всегда так:
Код

{
    TCHAR title[] = "Sample";    

    CFileDialog fileDlg(TRUE);
    
    CString str("All files (*.*)"); str += (TCHAR)NULL;
    str += "*.*"; str += (TCHAR)NULL;

    str += ("All text files (*.txt)"); str += (TCHAR)NULL;
    str+= "*.txt"; str += (TCHAR)NULL;
         
    fileDlg.m_ofn.lpstrFilter = str;
    fileDlg.m_ofn.nFilterIndex = 2;

    TCHAR strName[_MAX_PATH];
    strName[0] = (TCHAR)NULL;
    fileDlg.m_ofn.lpstrFile = strName;

    fileDlg.m_ofn.lpstrTitle = title;

    if (fileDlg.DoModal() == IDOK)
    {
                 //......                 
    }
}

Автор: DENNN 24.6.2005, 09:29
Цитата(Darked @ 23.6.2005, 15:08)
меня не интересует сам фильтр, меня интересует почему так переменная объявлена:

Объявлена как сам тип в классе. Если завтра в этом классе тип изменится, то в этом участке кода тип будет соотвествовать изменениям. В идеале тебе вообще не нужно беспокоиться что же именно это за тип данных. Но это в идеале, реальность, как известно, вносит свои коррективы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)