Диалоговые окна "Открыть" и "Сохранить как"

Примечание

Функция GetOpenFileName показана в примере использования файла.

[Начиная с Windows Vista, общие диалоговые окна "Открыть" и "Сохранить как" заменены диалоговым окном "Общий элемент". Мы рекомендуем использовать API общих диалоговых окон вместо этих диалоговых окон из библиотеки общих диалоговых окон.]

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

Диалоговое окно Сохранить как позволяет пользователю указать диск, каталог и имя файла для сохранения. Диалоговое окно Сохранить как создается и отображается путем инициализации структуры OPENFILENAME и передачи структуры в функцию GetSaveFileName .

Обозреватель стиле диалоговых окон Открыть и Сохранить как предоставляют функции пользовательского интерфейса, аналогичные Обозреватель Windows. Однако система по-прежнему поддерживает диалоговые окна "Открыть" и "Сохранить как " старого стиля для приложений, которые должны соответствовать старому пользовательскому интерфейсу.

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

На следующем рисунке показано типичное диалоговое окно "Открыть" в стиле Обозреватель.

Диалоговое окно

На следующем рисунке показано типичное диалоговое окно "Сохранить как" в Обозреватель стиле.

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

Если пользователь указывает имя файла и нажимает кнопку ОК , getOpenFileName или GetSaveFileName возвращает значение TRUE. Буфер, на который указывает элемент lpstrFile структуры OPENFILENAME , содержит полный путь и имя файла, указанные пользователем.

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

В этом разделе рассматриваются следующие темы.

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

Сведения в этом разделе относятся как к диалоговым окнам "Открыть" и "Сохранить как" в стиле Обозреватель, так и в старом стиле.

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

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

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

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

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

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

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

Стиль диалогового окна Описание
Диалоговые окна в Обозреватель стиле Строки имени каталога и файла разделены значением NULL , а после последнего имени файла — дополнительным символом NULL . Этот формат позволяет диалоговым окнам в стиле Обозреватель возвращать длинные имена файлов, включающие пробелы.
Диалоговые окна старого стиля Строки имени каталога и файла разделяются пробелами. Для имен файлов с пробелами функция использует короткие имена файлов.

 

Для преобразования длинных и коротких имен файлов можно использовать функцию FindFirstFile .

Если вы указываете OFN_ALLOWMULTISELECT и пользователь выбирает только один файл, строка lpstrFile не будет иметь разделителя между путем и именем файла.

Фильтры

Сведения в этом разделе относятся как к диалоговым окнам "Открыть" и "Сохранить как" в стиле Обозреватель, так и в старом стиле.

Вы можете предоставить фильтры имен файлов, чтобы помочь пользователю ограничить имена файлов, отображаемые в диалоговом окне. Фильтр имени файла состоит из пары строк, завершаемых значением NULL, описания и шаблона, которые объединяются с другой. В диалоговом окне отображается описание, позволяющее пользователю выбрать фильтр для использования; и использует шаблон для выбора отображаемых файлов.

Чтобы указать фильтры, задайте элемент lpstrFilter структуры OPENFILENAME , указывающий на буфер, содержащий массив пар строк фильтра. За последней строкой в массиве должен следовать дополнительный символ NULL.

Строка шаблона может быть сочетанием допустимых символов имени файла и звездочки (*). Звездочка — это подстановочный знак, представляющий любое сочетание допустимых символов имени файла. В диалоговом окне отображаются только те файлы, которые соответствуют шаблону. Чтобы указать несколько шаблонов для одного описания, необходимо использовать точку с запятой (;) для разделения шаблонов. Обратите внимание, что пробелы в строке шаблона могут привести к непредвиденным результатам.

В следующем фрагменте кода указываются два фильтра. Фильтр с описанием "Источник" имеет два шаблона. Если пользователь выбирает этот фильтр, в диалоговом окне отображаются только файлы с . C и . Расширения CXX. Обратите внимание, что на языке программирования C строка, заключенная в двойные кавычки, заканчивается null.

OPENFILENAME ofn;       // common dialog box structure

ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;

Элемент nFilterIndex структуры OPENFILENAME указывает индекс, указывающий, какой фильтр изначально используется в диалоговом окне. Первый фильтр в буфере имеет индекс 1, второй — 2 и т. д. Если пользователь изменяет фильтр при использовании диалогового окна, для элемента nFilterIndex устанавливается индекс выбранного фильтра при возврате.

Можно создать пользовательский фильтр, задав для элемента lpstrCustomFilter адрес буфера, содержащего один фильтр, и задав для элемента nMaxCustFilter размер буфера в символах или байтах. Диалоговое окно всегда помещает настраиваемый фильтр в начало списка фильтров и при возврате всегда обновляет часть шаблона фильтра шаблоном из фильтра, выбранного пользователем.

Для диалоговых окон в стиле Обозреватель расширение по умолчанию может измениться, если пользователь выберет другой фильтр. Если пользователь выбирает фильтр, первый шаблон которого имеет вид *. xxx (то есть расширение не содержит подстановочный знак), диалоговое окно использует xxx в качестве расширения по умолчанию. Это происходит, только если вы указали расширение по умолчанию в элементе lpstrDefExt структуры OPENFILENAME . Например, если пользователь выбирает "Источник\0*. C;*. Фильтр CXX\0", расширение по умолчанию изменяется на "C". Однако, если вы определили фильтр как "Источник\0*. C*\0", расширение по умолчанию не изменится, так как расширение содержит подстановочный знак.

Сообщение CDN_INCLUDEITEM уведомления предоставляет еще один способ фильтрации имен, отображаемых в диалоговом окне. Чтобы использовать это сообщение, укажите процедуру перехватчика OFNHookProc и укажите флаг OFN_ENABLEINCLUDENOTIFY в структуре OPENFILENAME при создании диалогового окна. Каждый раз, когда пользователь открывает папку, диалоговое окно отправляет CDN_INCLUDEITEM уведомление в процедуру перехватчика для каждого элемента в открывшейся папке. Возвращаемое значение процедуры перехватчика указывает, должно ли диалоговое окно отображать элемент в списке элементов папки.

Проверка файлов и каталогов

За исключением указанных выше случаев, сведения в этом разделе относятся как к диалоговым окнам Обозреватель, так и к диалоговым окнам "Открыть" и "Сохранить как".

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

Чтобы в диалоговом окне убедиться, что пользователь указал имя существующего файла, установите флаг OFN_FILEMUSTEXIST . Чтобы принудительно проверить, существует ли указанный путь, установите флаг OFN_PATHMUSTEXIST . Если вы задали флаг OFN_CREATEPROMPT , диалоговое окно запрашивает у пользователя разрешение на создание несуществующего файла. Если этот флаг установлен и пользователь решает создать новый файл, диалоговое окно закрывается, а функция возвращает указанное имя. В противном случае диалоговое окно остается открытым.

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

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

Если включить процедуру перехватчика, диалоговое окно уведомляет вашу процедуру перехватчика о нарушении общего доступа к сети для имени файла, указанного пользователем. Если вы задали флаг OFN_EXPLORER , диалоговое окно отправляет CDN_SHAREVIOLATION сообщение в процедуру перехватчика. Если не задать OFN_EXPLORER, диалоговое окно отправляет зарегистрированное сообщение SHAREVISTRING в процедуру перехватчика. Чтобы предотвратить отправку в диалоговом окне уведомлений о нарушениях общего доступа, установите флаг OFN_SHAREAWARE .

Если пользователь выбирает проверка только для чтения, при возвращении диалоговое окно устанавливает флаг OFN_READONLY. Чтобы скрыть поле Открыть как только для чтения проверка, установите флаг OFN_HIDEREADONLY. Чтобы в диалоговом окне не возвращались имена существующих файлов, имеющих атрибут только для чтения, установите флаг OFN_NOREADONLYRETURN .

Чтобы предотвратить разыменовку файлов ссылок в диалоговом окне, задайте значение OFN_NODEREFERENCELINKS . В этом случае диалоговое окно возвращает имя файла ссылки, а не имя файла, на который ссылается файл ссылки.

Настройка диалогового окна "Открыть и сохранить как"

Диалоговое окно Открыть или Сохранить как можно настроить, предоставив процедуру перехватчика, пользовательский шаблон или и то, и другое. Однако Обозреватель и старые версии диалоговых окон отличаются использованием пользовательских шаблонов и процедур перехватчика.

Сведения о настройке диалогового окна в стиле Обозреватель см. в разделах Процедуры перехватчика в стиле Обозреватель, пользовательские шаблоны Обозреватель стиле и идентификаторы элементов управления в стиле Обозреватель. Сведения о настройке диалогового окна старого стиля см. в разделе Настройка диалоговых окон Old-Style.

В следующей таблице перечислены различия между этими двумя стилями.

Настройка Описание
Обозреватель процедура перехватчика Процедура перехватчика получает уведомления, отправляемые из общего диалогового окна, и сообщения для всех дополнительных элементов управления, определенных путем указания дочернего шаблона диалогового окна. Процедура перехватчика не получает сообщения для стандартных элементов управления диалогового окна по умолчанию.
Настраиваемый шаблон в стиле Обозреватель Система использует пользовательский шаблон для создания дочернего диалогового окна. Шаблон может определять дополнительные элементы управления и может указывать расположение кластера стандартных элементов управления. Пользовательский шаблон не заменяет шаблон по умолчанию.
Старый стиль процедуры перехватчика Процедура перехватчика получает все сообщения, отправляемые в диалоговое окно, включая сообщения для стандартных элементов управления и любых пользовательских элементов управления. Процедура перехватчика также получает зарегистрированные сообщения, отправленные из общего диалогового окна.
Настраиваемый шаблон старого стиля Пользовательский шаблон заменяет шаблон по умолчанию. Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле Fileopen.dlg.

 

По умолчанию для диалоговых окон Обозреватель и в старом стиле используется заголовок "Открыть" или "Сохранить как". Чтобы изменить заголовок, укажите новый заголовок в элементе lpstrTitle структуры OPENFILENAME.

Куст реестра HKEY_CURRENT_USER пользователя может содержать значения, которые настраивают содержимое диалоговых окон "Открыть" и "Сохранить как" в стиле Обозреватель. Эти записи реестра влияют только на диалоговые окна, отображаемые для пользователя, связанного с кустом реестра.

Чтобы скрыть функции диалоговых окон "Открыть" и "Сохранить как" в стиле Обозреватель, администратор может задать значения в следующей таблице в этом подразделе:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
Имя значения Значение Значение
NoPlacesBar 1 Скрывает панель мест.
NoFileMRU 1 Скрывает список последних использованных (MRU).
NoBackButton 1 Скрывает кнопку Назад .

 

Содержимое панели "Места " определяется содержимым следующего подраздела:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
                     Placesbar

В настоящее время в этом ключе может быть только пять записей, а индекс значения и имени основан на нулях. Имена записей должны быть Place0, Place1, Place2, Place3 и Place4. Значения записей могут быть REG_DWORD, REG_SZ или REG_EXPAND_SZ значениями, определяющими расположения для включения в строку мест.

Тип значения Значение
REG_DWORD Значение CSIDL, определяющее папку. Список значений CSIDL см. в разделе Значения CSIDL.
REG_SZ или REG_EXPAND_SZ Строка, завершающаяся значением NULL, указывающая допустимый путь.

 

Процедуры перехватчика Explorer-Style

Вы можете настроить диалоговое окно "Открыть" или "Сохранить как" в стиле Обозреватель, указав процедуру перехватчика, пользовательский шаблон или и то, и другое. Если вы предоставляете процедуру перехватчика для диалогового окна Обозреватель стиле, система создает диалоговое окно, которое является дочерним по отношению к диалоговому окну по умолчанию. Процедура перехватчика выступает в качестве процедуры диалога для дочернего диалогового окна. Это дочернее диалоговое окно основано на пользовательском шаблоне или на шаблоне по умолчанию, если он не указан. Дополнительные сведения см. в статье Пользовательские шаблоны в стиле Обозреватель.

Чтобы включить процедуру перехватчика для диалогового окна Открыть или Сохранить как в стиле Обозреватель, при создании диалогового окна используйте структуру OPENFILENAME. Задайте флаги OFN_ENABLEHOOK и OFN_EXPLORER в элементе Flags и укажите адрес процедуры перехватчика OFNHookProc в элементе lpfnHook . Если вы указали процедуру перехватчика и опустите флаг OFN_EXPLORER , необходимо использовать процедуру перехватчика OFNHookProcOldStyle , и вы получите пользовательский интерфейс старого стиля. Дополнительные сведения см. в разделе Настройка диалоговых окон Old-Style.

При открытии диалогового окна процедура перехватчика в Обозреватель стиле получает различные сообщения. следующие основные параметры.

  • Сообщение WM_INITDIALOG и другие стандартные сообщения диалогового окна, например сообщение цвета элемента управления WM_CTLCOLORDLG .
  • Набор WM_NOTIFY уведомлений, указывающих действия, выполненные пользователем, или другие события диалогового окна.
  • Сообщения для всех дополнительных элементов управления, определенных путем указания дочернего шаблона диалогового окна.

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

Если вы предоставляете процедуру перехватчика для диалогового окна Обозреватель стиле, процедура диалогового окна по умолчанию создает дочернее диалоговое окно, когда диалоговая процедура по умолчанию обрабатывает WM_INITDIALOG сообщение. Процедура перехватчика выступает в качестве процедуры диалога для дочернего диалогового окна. В настоящее время процедура перехватчика получает собственное сообщение WM_INITDIALOG с параметром lParam , равным адресу структуры OPENFILENAME , используемой для инициализации диалогового окна. После того как дочерний диалог завершит обработку собственного сообщения WM_INITDIALOG , процедура диалога по умолчанию перемещает стандартные элементы управления, если это необходимо, чтобы освободить место для дополнительных элементов управления дочернего диалогового окна. Затем диалоговое окно по умолчанию отправляет CDN_INITDONE сообщение уведомления в процедуру перехватчика.

Процедура перехватчика получает WM_NOTIFY уведомления о действиях, выполненных пользователем в диалоговом окне. Некоторые из этих сообщений можно использовать для управления поведением диалогового окна. Например, процедура перехватчика получает сообщение CDN_FILEOK , когда пользователь выбирает имя файла и нажимает кнопку ОК . В ответ на это сообщение процедура перехватчика может использовать функцию SetWindowLong , чтобы отклонить выбранное имя и заставить диалоговое окно оставаться открытым.

Параметр lParam для каждого сообщения WM_NOTIFY является указателем на структуру OFNOTIFY или OFNOTIFYEX , которая определяет действие. Элемент кода в заголовке этой структуры содержит одно из следующих сообщений уведомления.

Сообщение Значение
CDN_FILEOK Пользователь нажал кнопку ОК ; диалоговое окно будет закрыто.
CDN_FOLDERCHANGE Пользователь открыл новую папку или каталог.
CDN_HELP Пользователь нажал кнопку Справка .
CDN_INCLUDEITEM Определяет, должен ли отображаться элемент. Когда пользователь открывает новую папку или каталог, система отправляет это уведомление для каждого элемента в папке или каталоге. Система отправляет это уведомление только в том случае, если был установлен флаг OFN_ENABLEINCLUDENOTIFY .
CDN_INITDONE Система завершила инициализацию диалогового окна, а диалоговое окно завершило обработку сообщения WM_INITDIALOG . Кроме того, система завершила размещение элементов управления в общем диалоговом окне, чтобы освободить место для элементов управления дочернего диалогового окна (если таковые имеются).
CDN_SELCHANGE Пользователь выбрал новый файл или папку из списка файлов.
CDN_SHAREVIOLATION В обычном диалоговом окне обнаружено нарушение общего доступа к файлу, который должен быть возвращен.
CDN_TYPECHANGE Пользователь выбрал новый тип файла из списка типов файлов.

 

Эти WM_NOTIFY сообщения заменяют зарегистрированные сообщения FILEOKSTRING, LBSELCHSTRING, SHAREVISTRING и HELPMSGSTRING , используемые в предыдущих версиях диалоговых окон Открыть и Сохранить как . Однако процедура перехватчика также получает замененное сообщение после сообщения WM_NOTIFY , если обработка WM_NOTIFY не использует SetWindowLong для задания ненулевого DWL_MSGRESULT значения.

Чтобы получить сведения о состоянии диалогового окна или управлять поведением и внешним видом диалогового окна, процедура перехватчика может отправить в диалоговое окно следующие сообщения.

Сообщение Значение
CDM_GETFILEPATH Извлекает путь и имя выбранного файла.
CDM_GETFOLDERIDLIST Извлекает список идентификаторов элементов, соответствующий текущей папке, открытой в диалоговом окне. Дополнительные сведения о списках идентификаторов элементов см. в статье Общие сведения о пространстве имен оболочки.
CDM_GETFOLDERPATH Извлекает путь к текущей папке или каталогу для диалогового окна.
CDM_GETSPEC Извлекает имя файла (не включая путь) файла, выбранного в диалоговом окне.
CDM_HIDECONTROL Скрывает указанный элемент управления.
CDM_SETCONTROLTEXT Задает текст в указанном элементе управления.
CDM_SETDEFEXT Задает расширение имени файла по умолчанию для диалогового окна.

 

пользовательские шаблоны Explorer-Style

Чтобы определить дополнительные элементы управления для диалогового окна Открыть или Сохранить как в стиле Обозреватель, используйте структуру OPENFILENAME, чтобы указать шаблон для дочернего диалогового окна, содержащего дополнительные элементы управления. Если дочерний шаблон диалогового окна является ресурсом в приложении или библиотеке динамической компоновки, установите флаг OFN_ENABLETEMPLATE в элементе Flags и используйте элементы hInstance и lpTemplateName структуры для идентификации модуля и имени ресурса. Если шаблон уже находится в памяти, установите флаг OFN_ENABLETEMPLATEHANDLE и используйте элемент hInstance для идентификации объекта памяти, содержащего шаблон. При указании дочернего шаблона диалога для диалогового окна в Обозреватель стиле необходимо также установить флаг OFN_EXPLORER. В противном случае система предполагает, что вы предоставляете шаблон замены для диалогового окна старого стиля. Как правило, если вы предоставляете дополнительные элементы управления, необходимо также предоставить Обозреватель процедуру перехватчика для обработки сообщений для новых элементов управления.

Вы можете создать шаблон дочернего диалогового окна так же, как и любой другой шаблон, за исключением того, что необходимо указать стили WS_CHILD и WS_CLIPSIBLINGS , а также указать стили DS_3DLOOK и DS_CONTROL . Системе требуется стиль WS_CHILD , так как шаблон определяет дочерний диалог диалогового окна по умолчанию Открыть или Сохранить как . Стиль WS_CLIPSIBLINGS гарантирует, что дочернее диалоговое окно не будет закрашивать ни один из элементов управления в диалоговом окне по умолчанию. Стиль DS_3DLOOK гарантирует, что внешний вид элементов управления в дочернем диалоговом окне соответствует элементам управления в диалоговом окне по умолчанию. Стиль DS_CONTROL гарантирует, что пользователь может использовать tab и другие клавиши навигации для перемещения между всеми элементами управления (по умолчанию или пользовательскими) в настраиваемом диалоговом окне.

Чтобы освободить место для новых элементов управления, система расширяет диалоговое окно по умолчанию на ширину и высоту настраиваемого диалогового окна. По умолчанию все элементы управления из настраиваемого диалогового окна расположены под элементами управления в диалоговом окне по умолчанию. Однако это положение по умолчанию можно переопределить, включив статический текстовый элемент управления в настраиваемый шаблон диалогового окна и назначив ему значение идентификатора элемента управления stc32. (Это значение определено в файле заголовка Dlgs.h.) В этом случае система использует элемент управления в качестве точки отсчета для определения расположения новых элементов управления. Все новые элементы управления, расположенные выше и слева от элемента управления stc32 , размещаются одинаково выше и слева от элементов управления в диалоговом окне по умолчанию. Новые элементы управления ниже и справа от элемента управления stc32 расположены ниже и справа от элементов управления по умолчанию. Как правило, каждый новый элемент управления размещается таким образом, чтобы он имел такое же положение относительно элементов управления по умолчанию, что и для элемента управления stc32 . Чтобы освободить место для этих новых элементов управления, система при необходимости добавляет пространство слева, справа, снизу и верхней части диалогового окна по умолчанию.

Система требует, чтобы процедура перехватчика обрабатывала все сообщения, предназначенные для настраиваемого диалогового окна, и поэтому отправляет те же сообщения окна в процедуру перехватчика, что и для любой другой процедуры диалогового окна. Например, процедура перехватчика получает WM_COMMAND сообщений, когда пользователь нажимает кнопки управления в настраиваемом диалоговом окне. Процедура перехватчика отвечает за инициализацию этих элементов управления и получение значений из элементов управления при закрытии диалогового окна. Обратите внимание, что когда процедура перехватчика получает сообщение WM_INITDIALOG , система еще не переместила элементы управления в конечные позиции.

Процедура диалогового окна по умолчанию обрабатывает сообщения для всех элементов управления в диалоговом окне по умолчанию, но процедура перехватчика получает уведомления о действиях пользователя с этими элементами управления, как описано в статье Процедуры перехватчика в стиле Обозреватель.

Идентификаторы элементов управления Explorer-Style

Пакет средств разработки программного обеспечения (SDK) для Windows предоставляет шаблон диалогового окна по умолчанию для диалоговых окон старого стиля, но не включает шаблон по умолчанию для диалоговых окон Обозреватель стиле. Это связано с тем, что диалоговые окна в стиле Обозреватель позволяют добавлять собственные элементы управления, но не поддерживают изменение шаблона для стандартных элементов управления. Однако в некоторых случаях может потребоваться знать идентификаторы элементов управления, используемые в шаблонах по умолчанию. Например, для CDM_HIDECONTROL и CDM_SETCONTROLTEXT сообщений требуется идентификатор элемента управления.

В следующей таблице показаны идентификаторы стандартных элементов управления в Обозреватель стиле диалоговых окон Открыть и Сохранить как. Идентификаторы — это константы, определенные в Dlgs.h и Winuser.h.

Идентификатор элемента управления Описание элемента управления
chx1 Поле проверка только для чтения
cmb1 Раскрывающееся поле со списком, в котором отображается список фильтров типов файлов
stc2 Метка для поля со списком cmb1
cmb2 Раскрывающееся поле со списком, которое отображает текущий диск или папку и позволяет пользователю выбрать диск или папку для открытия.
stc4 Метка для поля со списком cmb2
cmb13 Раскрывающееся поле со списком, в котором отображается имя текущего файла, позволяет пользователю ввести имя открываемого файла и выбрать файл, который был открыт или сохранен недавно. Это касается более ранних Обозреватель совместимых приложений без обработчика или шаблона диалогового окна. Сравнение с edt1.
edt1 Изменить элемент управления , который отображает имя текущего файла или позволяет пользователю ввести имя открываемого файла. Сравните с cmb13.
stc3 Метка для поля со списком cmb13 и элемента управления редактирования edt1
lst1 Список, в котором отображается содержимое текущего диска или папки
stc1 Метка для списка lst1
IDOK Кнопка " ОК" (кнопка push)
IDCANCEL Кнопка "Отмена " (кнопка "Отправить")
pshHelp Кнопка " Справка " (кнопка "Отправить")

 

Настройка диалоговых окон Old-Style

Вы можете настроить диалоговое окно "Открыть " или "Сохранить как " старого стиля, предоставив процедуру перехватчика OFNHookProcOldStyle , которая получает сообщения или уведомления, предназначенные для процедуры диалогового окна по умолчанию. Вы также можете предоставить пользовательский шаблон для использования вместо шаблона по умолчанию. Процедуры-перехватчики и шаблоны, используемые в диалоговых окнах старого стиля, аналогичны тем, которые используются в других распространенных диалоговых окнах. Дополнительные сведения см. в разделе Процедуры перехвата для распространенных диалоговых окон и пользовательских шаблонов.

Чтобы включить процедуру перехватчика для диалогового окна "Открыть " или "Сохранить как ", используйте структуру OPENFILENAME при создании диалогового окна. Установите флаг OFN_ENABLEHOOK в элементе Flags и укажите адрес процедуры перехватчика OFNHookProcOldStyle в элементе lpfnHook . Процедура диалогового окна отправляет WM_INITDIALOG сообщение в процедуру перехватчика с параметром Param, заданным в адрес структуры OPENFILENAME , используемой для инициализации диалогового окна.

С помощью структуры OPENFILENAME можно указать настраиваемый шаблон для диалогового окна Открыть или Сохранить как вместо шаблона по умолчанию. Если настраиваемый шаблон является ресурсом в приложении или библиотеке динамической компоновки, установите флаг OFN_ENABLETEMPLATE в элементе Flags и используйте элементы hInstance и lpTemplateName структуры для идентификации модуля и имени ресурса. Если пользовательский шаблон уже находится в памяти, установите флаг OFN_ENABLETEMPLATEHANDLE и используйте элемент hInstance для идентификации объекта памяти, содержащего шаблон. Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле Fileopen.dlg. Идентификаторы элементов управления, используемые в шаблонах диалогов поиска и замены по умолчанию, определяются в файле Dlgs.h.

По умолчанию функции GetOpenFileName и GetSaveFileName отображают диалоговые окна в стиле Обозреватель. Если вы хотите отобразить диалоговое окно старого стиля, необходимо указать процедуру перехватчика OFNHookProcOldStyle и убедиться, что флаг OFN_EXPLORER не задан в элементе Flags структуры OPENFILENAME .

Если вы задали флаг OFN_EXPLORER, система обрабатывает процедуру перехватчика или пользовательский шаблон как настройку Обозреватель стиле. Сведения о настройке диалогового окна в стиле Обозреватель см. в разделе Пользовательские шаблоны в Обозреватель стиле.

См. также раздел