Win32 API. Библиотека стандартных диалоговых окон
Страница 11. Диалоговые окна Открыть (Open) и Сохранить как (Save As)


Диалоговые окна Открыть (Open) и Сохранить как (Save As)

Диалоговое окно Открыть (Open) позволяет пользователю, определить диск, каталог и имя файла или набора файлов, которые надо открыть. Вы создаете и показываете диалоговое окно Открыть (Open), инициализируя структуру OPENFILENAME и передавая структуру в функцию GetOpenFileName.

Диалоговое окно Сохранить как (Save As) позволяет пользователю, определить диск, каталог и имя файла, которые надо сохранить. Вы создаете и показываете диалоговое окно Save As, инициализируя структуру OPENFILENAME и передавая структуру в функцию GetSaveFileName.

Начиная с Windows 95 и Windows NT версии 4.0, имеется новая версия диалоговых окон Открыть (Open) и Сохранить как (Save As), которые обеспечивают функции интерфейса пользователя, являясь сходными с Проводником Windows. Однако, Win32 продолжает поддерживать диалоговые окна Открыть(Open) и Сохранить как (Save As) старого стиля для прикладных программ, которые должны поддерживать интерфейс пользователя, не противоречащий более ранними версиями Windows.

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

Если пользователь определяет имя файла и щелкает мышью по кнопке OK, функция GetOpenFileName или GetSaveFileName возвращает значение ИСТИНА (TRUE). Буфер, указанный элементом lpstrFile структуры OPENFILENAME содержит полный путь и имя файла, определенное пользователем.

Если пользователь отменяет диалоговое окно Открыть (Open) или Сохранить как (Save As), или происходит ошибка, функция возвращает значение ЛОЖЬ (FALSE). Чтобы определять причину ошибки, вызовите функцию CommDlgExtendedError, чтобы извлечь расширенное значение ошибки. Если буфер lpstrFile слишком маленький, чтобы принять полное имя, CommDlgExtendedError возвращает FNERR_BUFFERTOOSMALL и первые 2 байта буфера, указанного элементом lpstrFile, приведенные к целочисленному значению, устанавливающему размер, требуемый, чтобы принять полное имя файла.

Диалоговые окна стиля Проводника доступны только 32-разрядным прикладным программам. 16-разрядные прикладные программы не могут использовать переключение (thunking), чтобы показать диалоговое окно в стиле Проводника.

Windows 95: 32-разрядные прикладные программы, которые используют диалоговые окна старого стиля, делают это, используя "переходник" (thunk). Это означает, что любой указатель, переданный вашей фильтр (hook) - процедуре - не устойчивая копия данных. Например, указатель OPENFILENAME, переданный в сообщении WM_INITDIALOG - не указывает на буфер, который вы первоначально определили. Если вы должны передать частные данные вашей фильтр (hook) - процедуре, отошлите ее в структуру и сохраните указатель на структуру в элементе lCustData структуры OPENFILENAME.

Имена файлов и каталоги

Информация в этом разделе применяется для диалоговых окон Открыть (Open) и Сохранить как (Save As) как в стиле Проводника, так и в старом стиле.

Перед вызовом функции GetOpenFileName или GetSaveFileName, элемент lpstrFile структуры OPENFILENAME должен указывать на буфер, который примет имя файла. Элемент nMaxFile должен определять размер, в байтах (для версии ANSI) или символах (для версии Уникода), буфера lpstrFile.

Если пользователь задает имя файла и щелкает мышью по кнопке OK, диалоговое окно копирует выбранный диск, каталог и имя файла в буфер lpstrFile. Функция также устанавливает элементы nFileOffset и nFileExtension со смещением, в байтах или символах, с самого начала буфера для имени файла и для расширения имени файла, соответственно.

Чтобы извлечь только имя файла и расширение, установите элемент lpstrFileTitle так, чтобы он указывал на буфер, а в элементе nMaxFileTitle установите размер, в байтах (версия ANSI) или символах (версия Уникода), буфера. Или же, вы можете передать буфер lpstrFile при вызове функции GetFileTitle, чтобы получить отображение имени выбранного файла. Однако обратите внимание, что имя файла, которое GetFileTitle возвращает, включает в себя расширение только в том случае, если это является выбором пользователя для отображающихся имен файлов.

Диалоговое окно использует текущий каталог для процесса вызова в качестве начального каталога от которого отображаются файлы и каталоги. Используйте функции GetCurrentDirectory или SetCurrentDirectory, чтобы получить или изменить ваш текущий каталог. Чтобы определить другой начальный каталог без изменения вашего текущего каталога, используйте элемент lpstrInitialDir, для определения имени каталога. Диалоговое окно автоматически изменит ваш текущий каталог, когда пользователь выберет другой диск или каталог. Чтобы диалоговому окну запретить изменять ваш текущий каталог, установите флажок OFN_NOCHANGEDIR. Этот флажок не мешает пользователю изменять каталоги для поиска файла.

Чтобы определить заданное по умолчанию расширение имени файла, используйте элемент lpstrDefExt. Если пользователь задает имя файла, которое не имеет расширения, диалоговое окно добавляет свое заданное по умолчанию расширение. Если вы определяете заданное по умолчанию расширение, а пользователь определяет имя файла с другим расширением, диалоговое окно устанавливает флажок OFN_EXTENSIONDIFFERENT.

Чтобы позволить пользователю выбрать из каталога несколько файлов, установите флажок OFN_ALLOWMULTISELECT. Для совместимости со старыми прикладными программами, заданное по умолчанию диалоговое окно многокомпонентного выбора использует пользовательский интерфейс старого стиля. Чтобы показать диалоговое окно многокомпонентного выбора в стиле Проводника, вы должны к тому же установить флажок OFN_EXPLORER.

Если пользователь выбирает больше чем один файл, буфер, указанный элементом lpstrFile возвращает путь к текущему каталогу, сопровождаемому именами выбранных файлов. Элемент nFileOffset - смещение, для первого имени файла, а элемент nFileExtension не используется. Следующая таблица описывает различие между диалоговыми окнами в стиле Проводника и в старом стиле при возврате большого числа имен файлов.

  • Диалоговое окно в стиле Проводника - Строки каталога и имени файла отделяются значением ПУСТО (NULL), с дополнительным символом NULL после последнего имени файла. Этот формат дает возможность диалоговым окнам в стиле Проводника возвращать длинные имена файла, которые включают пробелы.
  • Диалоговое окно старого стиля - Строки каталога и имени файла отделяются пробелами. Для имен файла с пробелами, функция использует короткие имена файлов.

 

 
« Предыдущая статья   Следующая статья »