C окно выбора файла

Обновлено: 05.07.2024

Продолжаем развивать проект остановленный на шаге "Шаг 13 - Обмен данными с диалоговой панелью без DDX". Нам необходимо создать пункт меню Open в меню File с идентификатором ID_OPEN.

Создаем код

Реакция на событие выбора меню.

Описание функции реакции:

Вот такое диалоговое окно появится при выборе пункта меню File -> Open.

Описание

В MFC есть стандартный класс для открытия и сохранения файлов CFileDialog. Смотрите, в функции OnOpen() объявляем класс, первый параметр простой TRUE - диалог открытия, FALSE диалог сохранения. Следующий параметр нам сейчас не нужен, он есть ниже. И расширения для открытия. Функция DoModal() вам знакома, если она возвращает код кнопки OK, то получаем имя файла функцией с названием, которое даже переводить не хочется.

Диалог сохранения файла:

Выбор нескольких файлов в диалоговом окне:

Так выглядит диалог в режиме выбора нескольких файлов.

При выборе нескольких файлов может возникнуть ситуация, что Вы не можете выбрать файлов больше некоторого количества. Выход в увеличении внутреннего буфера, вот так это можно сделать.

После расширения можно указывать параметры окна диалога, вот я и указал, выбирай несколько файлов. А вот дальше мы должны получить позицию в переменную типа POSITION, эта переменная передается как указатель в функцию GetNextPathName(), а она выдает строку по этой позиции, и заодно уменьшает позицию. Когда файлов нет позиция станет равной 0.

Фильтр на несколько файлов:

Как видите, через точку с запятой можно передавать несколько расширений. Это не MFC придумало естественно. В Windows функция открытия файлов уже есть, и эта возможность взята из Win32 описания.

Выбор типа. За типом указан фильтр. Расширения для открытия ограничены скобками |*.mak|.

Вот так это выглядит:

Добавление расширения для сохранения файлов. Как видите теперь установлена 2-я переменная. Это расширение, которое будет добавляться в конец файла.

Всякий раз, когда Вы открываете/закрываете файл в любом приложении Windows, Вы сталкиваетесь примерно с одинаковыми диалоговыми окнами. Причиной этого, конечно же является то, что эти окна являются частью Windows API, а, следовательно, доступны разработчикам на платформе Windows.

Для WPF вы можете найти стандартные диалоговые окна как для сохранения, так и для открытия файлов в пространстве имен Microsoft.Win32. В этой статье мы рассмотрим класс OpenFileDialog, который позволяет легко отображать окно для открытия одного/нескольких файлов.

Простой пример использования OpenFileDialog

Давайте начнем использование OpenFileDialog без дополнительных опций, с помощью TextBox:


При нажатии на кнопку Open, отображается окно OpenFileDialog. В зависимости от Вашей версии Windows, Вы увидите нечто подобное:


Метод ShowDialog() возвращает логическое nullable значение (может быть true, false либо null). Если пользователь выберет файл и нажмет "Open" результатом будет True, и в этом случае мы попытаемся загрузить файл в элемент TextBox. Мы получили полный путь к выбранному файлу с помощью свойства FileName в OpenFileDialog.

Фильтрование

Обычно, при выборе файла, пользователь желает ограничить выбор одним или несколькими типами файлов. Например, Word в основном открывает файлы Word (с расширением .doc или .docx), а Блокнот - текстовые файлы (.txt).

Вы можете определить фильтр для диалоговоко окна OpenFileDialog с возможностью выбора ипользователем типов файлов и ограничения файлов, для большей наглядности. Это осуществляется с помощью свойства Filter, которое мы добавим к предыдущему примеру (после инициализации окна):


Заметьте, что теперь окно имеет выпадающий список с возможными для выбора типами файлов, все файлы отображаются в соответствии с выбранным расширением.

На первый взгляд, формат определения фильтра может показаться слегка странным, но в нем представлена удобочитаемая версия для пользователя и другая, для компьютера, который будет в состоянии их "прочитать" и разделить с помощью символа-сепаратора "|". Если Вы хотите определить больше чем один тип (как было в примере), просто добавьте необходимые Вам, с помощью выше введенного сепаратора.

Подводя итог, следующий код означает, что мы присваиваем типу название "Text files (*.txt)" (расширение в скобках - это знак внимания пользователю, он будет знать, какие типы включены в "Text files"), а вторая часть определяет, что будут показаны файлы с расширением .txt:

Конечно же, каждый создаваемый тип может иметь множество расширений. Например, изображения могут быть определены как для JPEG, так и для PNG файлов, вот так:

Просто отделите каждое расширение точкой с запятой во второй части (той, которая для компьютера), а в первой можете отформатировать текст как Вам будет угодно, но, большинство разработчиков пользуются одной и той же нотацией для двух частей, как на примере выше.

Определение каталога по умолчанию

Первоначальный каталог используемый классом OpenFileDialog уже определен в Windows, но используя свойство InitialDirectory, его можно переопределить. Обычно, Вы будете определять это значение специально для пользователя, всего приложения или, возможно, как каталог, который был использован с последний раз. Вы можете его определить как путь в формате строки, вот так:

В этом случае, я использовал путь к папке "Мои Документы", но обратите внимание на перечисление SpecialFolder - оно содержит множество интересных путей. Если хотите изучить полный список SpecialFolder, воспользуйтесь этой статьей MSDN.

Несколько файлов

Если Ваше приложение должно поддерживать открытие нескольких файлов или Вы просто хотите понять, как использовать OpenFileDialog для одновременного открытия нескольких файлов, просто включите свойство Multiselect. В следующем примере, мы это с успехом проделали, и, наш дорогой Читатель, собрали в одном все механизмы, рассмотренные в текущей главе (фильтрация, определение каталога по умолчанию):


Если Вы протестируете этот код, то заметите, что выбирать несколько файлов в одном каталоге становится возможным путем удерживания Ctrl или Shift и нажатием мыши. Выбрав их механизм в этом примере просто добавит файлы в элемент ListBox, в цикле по свойству FileNames.

В итоге

Наверняка Вы обратили внимание на то, что использование OpenFileDialog в WPF является очень простым, к тому же, данный механизм делает большую часть работы за Вас. Но заметьте, что в данном примере, для экономии места в коде, я не посвятил ни одной строки обработке исключений. При работе с файлами, и в целом при работе с входом-выходом, Вам всегда следует опасаться исключений, так как они легко могут появиться при работе с заблокированным файлом, несуществующим путем или другими.

Объект Visual c++ OpenFileDialog для работы с файлами

Разработайте приложение, которое выводит на экран выбранный графический файл

Целью урока является знакомство с тем, как осуществляется в Visual c++ работа с файлами, рассматриваются принципы работы с объектом OpenFileDialog .

Инструментарий:

объект свойство name
форма
контейнер для изображения (PictureBox) pct
кнопка (button) btn
диалоговое окно (OpenFileDialog) file1

visual c++ работа с файловой системой через OpenFileDialog

Выполнение:

  1. Создайте новый проект и расположите элементы управления PictureBox (pct) и Button (btn) на новой форме, как показано на рисунке. Добавьте также элемент управления OpenFileDialog (в свитке Диалоговые окна). Это скрытый элемент, не отображается в дизайне формы. Для свойства name элемента задайте имя file1.
  2. Предположим, необходимо открывать только изображения формата jpg. В таком случае, необходимо задать фильтр. Сделать это следует при загрузке формы, т.е. нужно запрограммировать событие Load для формы:

До прямого слэша указывается, как будет отображаться фильтр в окне, а после – сама маска фильтра.

  1. Теперь осталось вывести изображение в PictureBox (pct). Для этого запрограммируем событие click для кнопки:

String ^fname;// объявление строковой переменной file1->ShowDialog();//открываем диалоговое окно fname=file1->FileName;//используем переменную для хранения имени выбранного файла pct->Image=Image::FromFile(fname);//загружаем файл в элемент PictureBox

Здесь мы опустили все обращения к this->, это допускается в visual c++.

Запись была обновлена

Компонент OpenDialog служит для открытия указанного файла и загрузки данных. Компонент SaveDialog, соответственно, необходим для сохранения данных в файл. Все свойства у компонентов идентичны, но немного отличаются только по смыслу назначения.

Свойство FileName

Является основным свойством компонентов OpenDialog и SaveDialog, которое возвращает пользовательский файл FileName в виде строки. Можно задать значение свойства перед обращением к диалогу, в этом случае, при появлении окна загрузки/сохранения файла будет задано имя файла по умолчанию.

Свойство Filter

Указывает какие типы файлов можно загружать в приложение или в какие типы файлов приложение будет сохранять данные. Во время программирования следует указывать параметры свойства Filter, чтобы ограничить компонентам OpenDialog и SaveDialog диапазон типов файлов. Чтобы открыть окно редактора, следует нажать на многоточие рядом со свойством Filter в окне «Инспектор объектов». В столбце FilerName указывается название типов файлов, которое будет отображаться в выпадающем списке. В столбце Filter указывается тип файлов.

Свойство Filter

Также значение свойства можно задавать программно для компонента OpenDialog или SaveDialog.

Пример создания фильтра

Каждый тип файлов разделяется точкой с запятой, а название файла с типом разделяются вертикальной линией.

Свойство FilterIndex

Задаёт для компонента OpenDialog или SaveDialog какой фильтр будет отображаться по умолчанию. Свойство FilterIndex удобно использовать, когда указан не один фильтр типов файлов, а несколько, и чтобы вручную не переписывать все. Так гораздо удобнее, указав значение FilterIndex = 1, в этом случае по умолчанию будет показан первый фильтр по списку.

Свойство InitialDir

Задаёт начальный каталог, который будет показан в момент открытия диалогового окна OpenDialog или SaveDialog. В случае, если свойство InitialDir не задано, будет открыт текущий каталог или каталог, к которому пользователь в последнее время обращался во время работы приложения. Рекомендуется указывать путь каталога, если приложение использует, например, собственный тип файлов.

Свойство DefaultExt

Задаёт расширения файла в строке названия по умолчанию. Если свойства не задано, то пользователю необходимо указать в диалоговом окне полностью имя файла с расширением. Если указать значение, то пользователю достаточно написать только имя файла, а расширение будет задано автоматически.

Свойство Title

Задаёт имя заголовка диалогового окна OpenDialog или SaveDialog. Если свойство не задано, то откроется диалоговое окно с заголовком, заданным системой. Если указать значение свойству, например, «Укажите имя и тип файла», то открываемое диалоговое окно будет с указанным заголовком.

Читайте также: