- Использование диалоговых окон
- Отображение окна сообщения
- Создание модального диалогового окна
- Создание немодального диалогового окна
- Инициализация диалогового окна
- Создание шаблона в памяти
- Открытие и сохранение диалоговых окон
- Имена файлов и каталоги
- Фильтры
- Проверка файлов и каталогов
- Настройка диалогового окна «открыть и сохранить как»
- Explorer-Style процедуры-обработчики
- Explorer-Style пользовательских шаблонов
- Идентификаторы элементов управления Explorer-Style
- Настройка диалоговых окон Old-Style
Использование диалоговых окон
Используйте диалоговые окна для вывода сведений и запроса ввода от пользователя. Приложение загружает и Инициализирует диалоговое окно, обрабатывает входные данные пользователя и уничтожает диалоговое окно, когда пользователь завершает задачу. Процесс обработки диалоговых окон зависит от того, является ли диалоговое окно модальным или немодальным. Модальное диалоговое окно требует, чтобы пользователь закрыл диалоговое окно перед активацией другого окна в приложении. Однако пользователь может активировать Windows в разных приложениях. Немодальное диалоговое окно не требует немедленного ответа от пользователя. Он аналогичен главному окну, содержащему элементы управления.
В следующих разделах описывается использование обоих типов диалоговых окон.
Отображение окна сообщения
Простейшей формой модального диалогового окна является окно сообщения. Большинство приложений используют окна сообщений для предупреждения пользователя об ошибках и для запроса инструкций о том, как продолжать работу после возникновения ошибки. Создайте окно сообщения с помощью функции MessageBox или мессажебоксекс , указав сообщение и число и тип отображаемых кнопок. Система создает модальное диалоговое окно, предоставляя собственный шаблон и процедуру диалогового окна. После того, как пользователь закроет окно сообщения, MessageBox или мессажебоксекс возвращает значение, идентифицирующее кнопку, выбранную пользователем, чтобы закрыть окно сообщения.
В следующем примере приложение отображает окно сообщения, предлагающее пользователю ввести действие после возникновения ошибки. В окне сообщения отобразится сообщение с описанием условия ошибки и способами ее устранения. _ Данет в стиле «МБ» направляет MessageBox для предоставления двух кнопок, с помощью которых пользователь может выбрать способ продолжения:
На следующем рисунке показаны выходные данные предыдущего примера кода:
Создание модального диалогового окна
Модальное диалоговое окно создается с помощью функции диалогбокс . Необходимо указать идентификатор или имя ресурса шаблона диалогового окна и указатель на процедуру диалогового окна. Функция диалогбокс загружает шаблон, отображает диалоговое окно и обрабатывает все входные данные пользователя до тех пор, пока пользователь не закроет диалоговое окно.
В следующем примере приложение отображает модальное диалоговое окно, когда пользователь нажимает кнопку » удалить элемент » из меню приложения. Диалоговое окно содержит элемент управления «поле ввода» (в котором пользователь вводит имя элемента) и кнопки «ОК » и «Отмена» . Идентификаторы элементов управления для этих элементов управления имеют ИДЕНТИФИКАТОРы _ ITEMNAME, идок и идканцел соответственно.
Первая часть примера состоит из инструкций, которые создают модальное диалоговое окно. Эти инструкции в процедуре окна для главного окна приложения создают диалоговое окно, когда система получает сообщение _ команды WM с _ идентификатором меню IDM DELETEITEM. Во второй части примера показана процедура диалогового окна, которая извлекает содержимое элемента управления «поле ввода» и закрывает диалоговое окно при получении _ командного сообщения WM .
Следующие инструкции создают модальное диалоговое окно. Шаблон диалогового окна — это ресурс в исполняемом файле приложения с идентификатором ресурса DLG _ DELETEITEM.
В этом примере приложение указывает его главное окно в качестве окна «владелец» для диалогового окна. Когда система первоначально отображает диалоговое окно, его расположение задается относительно верхнего левого угла клиентской области окна-владельца. Приложение использует возвращаемое значение из диалогбокс , чтобы определить, следует ли продолжить операцию или отменить ее. В следующих инструкциях определяется процедура диалогового окна.
В этом примере процедура использует жетдлгитемтекст для получения текущего текста из элемента управления Edit, идентифицируемого по идентификатору _ ITEMNAME. Затем процедура вызывает функцию EndDialog для задания возвращаемого значения диалогового окна как ИДОК или идканцел, в зависимости от полученного сообщения и для начала процесса закрытия диалогового окна. Идентификаторы ИДОК и ИДКАНЦЕЛ соответствуют кнопкам ОК и Отмена . После вызова метода EndDialog система отправляет дополнительные сообщения в процедуру для уничтожения диалогового окна и возвращает обратное значение диалогового окна функции, создавшей диалоговое окно.
Создание немодального диалогового окна
Можно создать немодальное диалоговое окно с помощью функции креатедиалог , указав идентификатор или имя ресурса шаблона диалогового окна, а также указатель на процедуру диалогового окна. Креатедиалог загружает шаблон, создает диалоговое окно и при необходимости отображает его. Приложение отвечает за получение и отправку сообщений о вводе пользователем в процедуру диалогового окна.
В следующем примере приложение отображает немодальное диалоговое окно (если оно еще не отображается), когда пользователь щелкает «переход к » из меню приложения. Диалоговое окно содержит элемент управления «поле ввода», флажок, а также кнопки » ОК » и «Отмена» . Шаблон диалогового окна — это ресурс в исполняемом файле приложения с идентификатором ресурса DLG _ goto. Пользователь вводит номер строки в элементе управления «поле ввода» и устанавливает флажок, чтобы указать, что номер строки относится к текущей строке. Идентификаторы элементов управления: _ line ID, ID _ АБСРЕЛ, ИДОК и идканцел.
Инструкции в первой части примера создают немодальное диалоговое окно. Эти инструкции в процедуре окна для главного окна приложения создают диалоговое окно, когда процедура окна получает сообщение _ команды WM с _ идентификатором меню IDM, но только в том случае, если глобальная переменная еще не содержит допустимый обработчик. Вторая часть примера — основной цикл обработки сообщений приложения. Цикл включает функцию исдиалогмессаже , чтобы убедиться, что пользователь может использовать интерфейс клавиатуры диалогового окна в этом немодальном диалоговом окне. В третьей части примера приведена процедура диалогового окна. Процедура извлекает содержимое элемента управления «поле ввода» и флажка, когда пользователь нажимает кнопку » ОК «. Процедура уничтожает диалоговое окно, когда пользователь нажимает кнопку Отмена .
В приведенных выше инструкциях креатедиалог вызывается, только если не hwndGoto содержит допустимый обработчик окна. Это гарантирует, что приложение не будет одновременно отображать два диалоговых окна. Для поддержки этого метода процедура диалогового окна должна иметь значение null при уничтожении диалогового окна.
Цикл обработки сообщений для приложения состоит из следующих инструкций.
Цикл проверяет допустимость диалогового окна в диалоговом окне и вызывает функцию исдиалогмессаже только в том случае, если этот маркер является допустимым. Исдиалогмессаже обрабатывает сообщение только в том случае, если оно принадлежит диалоговому окну. В противном случае возвращается значение false , и цикл отправляет сообщение в соответствующее окно.
В следующих инструкциях определяется процедура диалогового окна.
В приведенных выше инструкциях процедура обрабатывает сообщения _ командной строки WM _ инитдиалог и WM. Во время обработки _ Инитдиалог в WM процедура Инициализирует этот флажок, передавая текущее значение глобальной переменной в чеккдлгбуттон. Затем процедура возвращает значение true , чтобы система настроила фокус ввода по умолчанию.
Во время обработки _ команд WM это диалоговое окно закрывается только в том случае, если пользователь нажмет кнопку Отмена , то есть кнопку с идентификатором идканцел. Процедура должна вызвать дестройвиндов , чтобы закрыть немодальное диалоговое окно. Обратите внимание, что процедура также задает для переменной значение NULL , чтобы убедиться, что другие инструкции, зависящие от этой переменной, работают правильно.
Если пользователь нажмет кнопку ОК , процедура получает текущее состояние флажка и назначает его переменной фрелативе . Затем она использует переменную для получения номера строки из элемента управления Edit. Жетдлгитеминт преобразует текст в элементе управления «поле ввода» в целое число. Значение фрелативе определяет, интерпретирует ли функция число как значение со знаком или без знака. Если текст элемента управления «поле ввода» не является допустимым числом, жетдлгитеминт устанавливает значение переменной fError равным нулю. Процедура проверяет это значение, чтобы определить, следует ли отображать сообщение об ошибке или выполнить задачу. В случае ошибки процедура диалогового окна отправляет сообщение в элемент управления редактированием, направляя его для выбора текста в элементе управления, чтобы пользователь мог легко его заменить. Если жетдлгитеминт не возвращает ошибку, процедура может либо выполнить запрошенную задачу, либо отправить сообщение в окно владельца, направляя его для выполнения операции.
Инициализация диалогового окна
Вы Инициализирует диалоговое окно и его содержимое при обработке сообщения WM _ инитдиалог . Наиболее распространенной задачей является инициализация элементов управления для отражения текущих настроек диалогового окна. Другой распространенной задачей является центрирование диалогового окна на экране или в окне его владельца. Полезной задачей для некоторых диалоговых окон является установка фокуса ввода на указанный элемент управления вместо принятия фокуса ввода по умолчанию.
В следующем примере диалоговое окно обрабатывает диалоговое окно и устанавливает фокус ввода при обработке сообщения WM _ инитдиалог . Для центрирования диалогового окна процедура извлекает прямоугольники окна для диалогового окна и окна владелец и вычисляет новую точку для диалогового окна. Чтобы установить фокус ввода, процедура проверяет параметр wParam , чтобы определить идентификатор фокуса ввода по умолчанию.
В приведенных выше инструкциях процедура использует функцию getHandler для получения маркера окна-владельца для диалогового окна. Функция возвращает обработчик окна владельца в диалоговые окна, а родительский окно — в дочерние окна. Поскольку приложение может создать диалоговое окно, не имеющее владельца, процедура проверяет возвращенный обработчик и использует функцию жетдесктопвиндов для получения маркера окна рабочего стола при необходимости. После вычисления новой должности процедура использует функцию SetWindowPos для перемещения диалогового окна, указывая _ верхнее значение HWND, чтобы убедиться, что диалоговое окно остается в верхней части окна владельца.
Перед установкой фокуса ввода процедура проверяет идентификатор элемента управления фокуса ввода по умолчанию. Система передает маркер окна фокуса ввода по умолчанию в параметре wParam . Функция жетдлгктрлид возвращает идентификатор элемента управления, идентифицируемого маркером окна. Если идентификатор не соответствует правильному идентификатору, процедура использует функцию SetFocus для установки фокуса ввода. Функция жетдлгитем необходима для получения маркера окна требуемого элемента управления.
Создание шаблона в памяти
Приложения иногда адаптируют или изменяют содержимое диалоговых окон в зависимости от текущего состояния обрабатываемых данных. В таких случаях нецелесообразно предоставлять все возможные шаблоны диалоговых окон в качестве ресурсов исполняемого файла приложения. Но создание шаблонов в памяти обеспечивает большую гибкость при адаптации к любым обстоятельствам.
В следующем примере приложение создает шаблон в памяти для модального диалогового окна, содержащего сообщение и кнопки « ОК » и « Справка ».
В шаблоне диалогового окна все символьные строки, например диалоговые окна и заголовки кнопок, должны быть строками в Юникоде. В этом примере используется функция MultiByteToWideChar для создания этих строк Юникода.
Структуры длгитемтемплате в шаблоне диалогового окна должны быть согласованы по границам DWORD . Чтобы выстроить эти структуры, в этом примере используется вспомогательная подпрограммы, которая принимает входной указатель и возвращает ближайший указатель, выравниваемая по границе DWORD .
Источник
Открытие и сохранение диалоговых окон
Функция GetOpenFilename показана в файле, который используется в качестве примера.
[начиная с Windows Vista общие диалоговые окна » открыть » и » сохранить как » были заменены диалоговым окном общих элементов. Рекомендуется использовать API-интерфейс общего элемента, а не эти диалоговые окна из библиотеки общих диалоговых окон.]
Диалоговое окно Открыть позволяет пользователю указать диск, каталог и имя файла или набора файлов, которые нужно открыть. Вы создаете и отображаете открытое диалоговое окно, инициализируя структуру OpenFileName и передавая структуру в функцию GetOpenFilename .
Диалоговое окно Сохранить как позволяет пользователю указать диск, каталог и имя сохраняемого файла. Вы создаете и отображаете диалоговое окно Сохранить как , инициализируя структуру OpenFileName и передавая структуру в функцию жетсавефиленаме .
в диалоговых окнах » открыть » и » сохранить как » обозревателя представлены функции пользовательского интерфейса, аналогичные проводнику Windows. Однако система по-прежнему поддерживает диалоговые окна открытия и сохранения старого стиля для приложений, которые должны быть совместимы с пользовательским интерфейсом старого стиля.
В дополнение к различиям в внешнем виде диалоговые окна в стиле обозревателя и старого стиля отличаются использованием пользовательских шаблонов и процедур подключения для настройки диалоговых окон. Однако диалоговые окна в стиле обозревателя и старого стиля имеют одинаковое поведение для большинства основных операций, таких как указание фильтра имен файлов, проверка вводимых пользователем данных и получение имени файла, указанного пользователем. Дополнительные сведения о диалоговых окнах «Обозреватель-стиль» и «старый стиль» см. в разделе Настройка диалоговых окон «Открыть» и «сохранить как».
На следующем рисунке показано типичное диалоговое окно « Открыть в стиле обозревателя».
На следующем рисунке показано типичное диалоговое окно « Сохранение в стиле обозревателя».
Если пользователь задает имя файла и нажимает кнопку ОК , GetOpenFilename или жетсавефиленаме возвращает значение true. Буфер, на который указывает член указанный структуры OpenFileName , содержит полный путь и имя файла, указанные пользователем.
Если пользователь отменяет диалоговое окно Открыть или Сохранить как или возникает ошибка, функция возвращает значение false. Чтобы определить причину ошибки, вызовите функцию коммдлжекстендедеррор , чтобы получить расширенное значение ошибки. Если буфер указанный слишком мал для получения полного имени, коммдлжекстендедеррор возвращает фнерр _ буффертусмалл , а первые 2 байта буфера, на который указывает элемент указанный , устанавливаются в целочисленное значение, определяющее размер, необходимый для получения полного имени.
В этом разделе рассматриваются следующие темы.
Имена файлов и каталоги
Сведения в этом разделе относятся к диалоговым окнам Открыть и Сохранить как в стиле обозревателя, так и в старом стиле.
Перед вызовом функций GetOpenFilename или жетсавефиленаме элемент указанный структуры OpenFileName должен указывать на буфер для получения имени файла. Элемент нмаксфиле должен указывать размер буфера указанный в символах. Для функции ANSI это число байтов, но для функции Юникода это число символов.
Если пользователь задает имя файла и нажимает кнопку ОК , диалоговое окно копирует выбранный диск, каталог и имя файла в буфер указанный . Функция также задает для элементов нфилеоффсет и нфиликстенсион смещения (в символах) от начала буфера до имени файла и расширения имени файла соответственно.
Чтобы получить только имя файла и расширение, установите элемент лпстрфилетитле , чтобы он указывал на буфер, и задайте для элемента нмаксфилетитле размер (в символах) буфера. Кроме того, можно передать буфер указанный в вызове функции жетфилетитле , чтобы получить отображаемое имя выбранного файла. Однако обратите внимание, что имя файла, возвращаемое жетфилетитле , включает расширение, только если это пользовательская предпочтение для отображения имен файлов.
В диалоговом окне используется текущий каталог для вызывающего процесса в качестве исходного каталога, из которого должны отображаться файлы и каталоги. Используйте функции GetCurrentDirectory и сеткуррентдиректори для получения и изменения текущего каталога процесса. Чтобы указать другой исходный каталог без изменения текущего каталога, используйте член лпстринитиалдир , чтобы указать имя каталога. Диалоговое окно автоматически изменяет текущий каталог, когда пользователь выбирает другой диск или каталог. Чтобы предотвратить изменение текущего каталога в диалоговом окне, установите флаг ОФН _ ночанжедир . Этот флаг не запрещает пользователю изменять каталоги для поиска файла.
Чтобы указать расширение имени файла по умолчанию, используйте элемент лпстрдефекст . Если пользователь указывает имя файла, у которого нет расширения, в диалоговом окне добавляется расширение по умолчанию. Если задано расширение по умолчанию и пользователь указывает имя файла с другим расширением, то в диалоговом окне устанавливается флаг ОФН _ екстенсиондифферент .
Чтобы позволить пользователю выбрать более одного файла из каталога, установите флаг ОФН _ алловмултиселект . Для совместимости с более старыми приложениями в диалоговом окне множественный выбор по умолчанию используется пользовательский интерфейс старого стиля. Для вывода диалогового окна «Выбор нескольких вариантов в стиле обозревателя» необходимо также установить флаг _ обозревателя ОФН .
Если пользователь выбирает более одного файла, буфер, на который указывает член указанный , возвращает путь к текущему каталогу, за которым следуют имена файлов выбранных файлов. Элемент нфилеоффсет является смещением к первому имени файла, а член нфиликстенсион не используется. В следующей таблице описывается различие между диалоговыми окнами в стиле обозревателя и старого стиля при возврате нескольких имен файлов.
Стиль диалогового окна | Описание |
---|---|
Диалоговые окна в стиле обозревателя | Строки имени файла и каталога с разделителями null разделяются символом null после последнего имени файла. Этот формат позволяет диалоговым окнам в стиле обозревателя возвращать длинные имена файлов, содержащие пробелы. |
Диалоговые окна старого стиля | Строки имен файлов и каталогов разделяются пробелами. Для имен файлов с пробелами функция использует короткие имена файлов. |
Функцию FindFirstFile можно использовать для преобразования между длинными и короткими именами файлов.
Если указать ОФН _ алловмултиселект и пользователь выбрал только один файл, то в строке указанный не будет разделителя между путем и именем файла.
Фильтры
Сведения в этом разделе относятся к диалоговым окнам «обозреватель-стиль» и « старый стиль» и « Сохранить как ».
Можно указать фильтры имен файлов, чтобы помочь пользователю в ограничении имен файлов, отображаемых в диалоговом окне. Фильтр имен файлов состоит из пары строк, завершающихся нулем, описания и шаблона, Объединенных в другой. В диалоговом окне отображается описание, позволяющее пользователю выбрать используемый фильтр. и использует шаблон для выбора файлов для вывода.
Чтобы указать фильтры, установите элемент лпстрфилтер структуры OpenFileName , чтобы он указывал на буфер, содержащий массив пар строк фильтра. За последней строкой в массиве должен следовать дополнительный символ null.
Строка шаблона может представлять собой сочетание допустимых символов имени файла и звездочки ( * ). Звездочка — это подстановочный знак, который представляет любое сочетание допустимых символов имени файла. В диалоговом окне отображаются только те файлы, которые соответствуют шаблону. Чтобы указать несколько шаблонов для одного описания, необходимо использовать точку с запятой (;) для разделения шаблонов. Обратите внимание, что пробелы в строке шаблона могут привести к непредвиденным результатам.
В следующем фрагменте кода указываются два фильтра. Фильтр с описанием «источник» имеет два шаблона. Если пользователь выбирает этот фильтр, в диалоговом окне отображаются только файлы с. C и. Расширения CXX. Обратите внимание, что в языке программирования C строка, заключенная в двойные кавычки, завершается нулем.
Элемент нфилтериндекс структуры OpenFileName задает индекс, который указывает, какой фильтр используется в первоначальном диалоговом окне. Первый фильтр в буфере имеет индекс 1, второй 2 и т. д. Если пользователь изменяет фильтр при использовании диалогового окна, для элемента нфилтериндекс задается индекс выбранного фильтра в поле Return.
Можно создать настраиваемый фильтр, задав для элемента лпстркустомфилтер адрес буфера, содержащего один фильтр, и установив для элемента нмакскустфилтер размер буфера в символах или байтах. В диалоговом окне Пользовательский фильтр всегда помещается в начало списка фильтров, а в случае возврата всегда обновляет часть шаблона фильтра с помощью шаблона из фильтра, выбранного пользователем.
Для диалоговых окон в стиле обозревателя расширение по умолчанию может измениться, если пользователь выбирает другой фильтр. Если пользователь выбирает фильтр, первый шаблон которого имеет форму * .XXX (т. е. расширение не содержит подстановочный знак), в диалоговом окне в качестве расширения по умолчанию используется xxx . Это происходит только в том случае, если в элементе лпстрдефекст структуры OpenFileName указано расширение по умолчанию. Например, если пользователь выбирает «source \ 0» * . C; * . CXX \ 0 «фильтр, расширение по умолчанию изменяется на» C «. Однако, если фильтр был определен как «Source 0» \ * . * \ В C 0 «расширение по умолчанию не изменится, так как расширение содержит подстановочный знак.
сообщение уведомления CDN _ инклудеитем предоставляет другой способ фильтрации имен, отображаемых в диалоговом окне. Чтобы использовать это сообщение, укажите процедуру-обработчик офнхукпрок и укажите флаг ОФН _ енаблеинклуденотифи в структуре OpenFileName при создании этого диалогового окна. каждый раз, когда пользователь открывает папку, диалоговое окно отправляет CDN уведомление _ в процедуру обработчика для каждого элемента во вновь открытой папке. Возвращаемое значение процедуры-обработчика указывает, должно ли диалоговое окно отображать элемент в списке элементов папки.
Проверка файлов и каталогов
Если не указано иное, сведения в этом разделе применяются к диалоговым окнам Открыть и Сохранить как в стиле обозревателя, так и в старом стиле.
Диалоговое окно автоматически проверяет имена файлов, введенные пользователем, чтобы гарантировать, что имена содержат только допустимые символы. Чтобы переопределить проверку символа имени файла, установите флаг ОФН. _
Чтобы заставить диалоговое окно подтвердить, что пользователь указал имя существующего файла, установите флаг ОФН _ выполнить операцию filemustexist . Чтобы принудительно выполнить проверку того, что указанный путь существует, установите флаг ОФН _ пасмустексист . Если установлен флаг ОФН _ креатепромпт , то диалоговое окно запрашивает у пользователя разрешение на создание несуществующего файла. Если этот флаг установлен и пользователь выбирает создание нового файла, диалоговое окно закрывается, а функция возвращает указанное имя. В противном случае диалоговое окно остается открытым.
При использовании диалогового окна Сохранить как можно направлять диалоговое окно, предлагающее пользователю запросить разрешение на перезапись существующего файла, установив флаг ОФН _ овервритепромпт .
По умолчанию диалоговое окно создает тестовый файл нулевой длины, чтобы определить, можно ли создать новый файл в выбранном каталоге. Чтобы предотвратить создание этого тестового файла, установите флаг ОФН _ нотестфилекреате .
При включении процедуры-обработчика диалоговое окно уведомляет процедуру-обработчик о том, что для имени файла, указанного пользователем, возникает нарушение общего доступа к сети. если задан флаг офн _ EXPLORER , то диалоговое окно отправляет в процедуру обработчика сообщение CDN _ шаревиолатион . Если не задать ОФН _ Explorer, диалоговое окно отправляет в процедуру обработчика зарегистрированное шаревистринг сообщение. Чтобы запретить диалоговому окну отправлять уведомления о нарушениях общего доступа, установите флаг ОФН _ шареаваре .
Если пользователь устанавливает флажок только для чтения, то диалоговое окно устанавливает флаг ОФН _ ReadOnly для возврата. Чтобы скрыть флажок Открыть как только для чтения , установите флаг ОФН _ хидереадонли . Чтобы диалоговое окно не возвращало имена существующих файлов с атрибутом только для чтения, установите флаг ОФН _ нореадонлиретурн .
Чтобы запретить диалоговому окну отменять ссылки на файлы ссылок, задайте значение ОФН _ нодереференцелинкс . В этом случае диалоговое окно возвращает имя файла ссылки, а не имя файла, на который ссылается файл ссылки.
Настройка диалогового окна «открыть и сохранить как»
Диалоговое окно Открыть или Сохранить как можно настроить, предоставив процедуру-обработчик, пользовательский шаблон или и то, и другое. Однако версии диалоговых окон в стиле обозревателя и старого стиля отличаются использованием пользовательских шаблонов и процедур-обработчиков.
Сведения о настройке диалогового окна в стиле обозревателя см. в разделе процедуры-обработчикив стиле обозревателя, пользовательские шаблоны в стиле обозревателяи идентификаторы элементов управления в стиле обозревателя. Сведения о настройке диалогового окна старого стиля см. в разделе Настройка диалоговых окон Old-Style.
В следующей таблице приведены различия между двумя стилями.
Настройка | Описание |
---|---|
Процедура обработчика в стиле обозревателя | Процедура-обработчик получает сообщения уведомления, отправленные из общего диалогового окна, и сообщения для любых дополнительных элементов управления, определенных с помощью шаблона дочернего диалогового окна. Процедура-обработчик не получает сообщения для стандартных элементов управления диалогового окна по умолчанию. |
Пользовательский шаблон в стиле обозревателя | Система использует пользовательский шаблон для создания дочернего диалогового окна. Шаблон может определять дополнительные элементы управления, а также указывать расположение кластера стандартных элементов управления. Пользовательский шаблон не заменяет шаблон по умолчанию. |
Процедура обработчика старого стиля | Процедура-обработчик получает все сообщения, отправленные в диалоговое окно, включая сообщения для стандартных элементов управления и пользовательских элементов управления. Процедура-ловушка также получает зарегистрированные сообщения, отправленные из общего диалогового окна. |
Пользовательский шаблон старого стиля | Пользовательский шаблон заменяет шаблон по умолчанию. Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле FileOpen. DLG. |
Заголовок по умолчанию для диалоговых окон как в стиле обозревателя, так и в старом стиле — «Открыть» или «Сохранить как«. Чтобы изменить заголовок, укажите новый заголовок в элементе лпстртитле структуры OpenFileName .
Куст реестра hKey для _ текущего _ пользователя , содержащийся в разделе, может содержать значения, которые настраивают содержимое диалоговых окон « Открытие » и « Сохранение » в стиле обозревателя. Эти записи реестра затрагивают только диалоговые окна, отображаемые для пользователя, связанного с кустом реестра.
Чтобы скрыть возможности диалоговых окон « Открыть » и « Сохранить как » в стиле обозревателя, администратор может задать значения в следующей таблице в этом подразделе:
Имя значения | Значение | Значение |
---|---|---|
ноплацесбар | 1 | Скрывает панель мест. |
нофилемру | 1 | Скрывает список недавно использованных (MRU) списков. |
нобаккбуттон | 1 | Скрывает кнопку » назад «. |
Содержимое панели мест определяется содержимым следующего подраздела:
В настоящее время в этом ключе может быть только пять записей, а индекс значения или имени — от нуля. Имена записей должны быть Place0, Place1, Place2, Place3 и Place4. Значения записей могут быть значениями reg _ DWORD, reg _ SZ или reg _ expand _ SZ , которые указывают расположения для включения в панель мест.
Тип значения | Значение |
---|---|
REG _ DWORD | Значение CSID, идентифицирующее папку. Список значений CSID см. в разделе значения CSid. |
Reg _ SZ или reg _ expand _ SZ | Строка, завершающаяся нулем и указывающая допустимый путь. |
Explorer-Style процедуры-обработчики
Можно настроить диалоговое окно Открытие или Сохранение в стиле обозревателя, предоставив процедуру-обработчик, пользовательский шаблон или и то, и другое. При предоставлении процедуры-обработчика для диалогового окна в стиле обозревателя система создает диалоговое окно, которое является дочерним по отношению к диалоговому окну по умолчанию. Процедура-обработчик выступает в качестве процедуры диалогового окна для дочернего диалогового окна. Это дочернее диалоговое окно основано на пользовательском шаблоне или в шаблоне по умолчанию, если он не указан. Дополнительные сведения см. в разделе пользовательские шаблоны в стиле обозревателя.
Чтобы включить процедуру-обработчик для диалогового окна « Открыть » или « Сохранить как » в стиле обозревателя, используйте структуру OpenFileName при создании диалогового окна. Задайте флаги ОФН _ Енаблехук и ОФН _ Explorer в элементе flags и укажите адрес процедуры-обработчика офнхукпрок в элементе лпфнхук . При предоставлении процедуры-обработчика и пропущении флага _ обозревателя ОФН необходимо использовать процедуру-обработчик офнхукпроколдстиле , и вы получите пользовательский интерфейс старого стиля. Дополнительные сведения см. в разделе Настройка диалоговых окон Old-Style.
При открытии диалогового окна процедура обработчика в стиле обозревателя получает разнообразные сообщения. следующие основные параметры.
- Сообщение WM _ инитдиалог и другие стандартные сообщения диалогового окна, такие как сообщение цвета элемента управления WM _ ктлколордлг .
- Набор сообщений уведомления WM _ Notify , указывающий действия, выполняемые пользователем или другим событием диалогового окна.
- Сообщения для любых дополнительных элементов управления, определенных путем указания дочернего шаблона диалогового окна.
Кроме того, существует набор сообщений, которые можно отправить в диалоговое окно в стиле обозревателя для получения сведений или управления поведением и внешним видом диалогового окна.
При предоставлении процедуры-обработчика для диалогового окна в стиле обозревателя процедура диалогового окна по умолчанию создает дочернее диалоговое окно, когда процедура диалогового окна по умолчанию обрабатывает сообщение WM _ инитдиалог . Процедура-обработчик выступает в качестве процедуры диалогового окна для дочернего диалогового окна. В настоящее время процедура-обработчик получает собственное сообщение WM _ инитдиалог с параметром lParam , равным адресу структуры OpenFileName , используемой для инициализации диалогового окна. После того как дочерний диалог завершает обработку своего сообщения _ инитдиалог WM , процедура диалогового окна по умолчанию при необходимости перемещает стандартные элементы управления, чтобы освободить место для любых дополнительных элементов управления дочернего диалогового окна. затем процедура диалогового окна по умолчанию отправляет сообщение уведомления CDN _ инитдоне в процедуру-обработчик.
Процедура-обработчик получает уведомления WM _ Notify , указывающие действия, выполняемые пользователем в диалоговом окне. Некоторые из этих сообщений можно использовать для управления поведением диалогового окна. например, процедура-обработчик получает сообщение CDN _ филеок , когда пользователь выбирает имя файла и нажимает кнопку ок . В ответ на это сообщение процедура-обработчик может использовать функцию SetWindowLong , чтобы отклонить выбранное имя и принудительно оставить диалоговое окно открытым.
Параметр lParam для каждого сообщения с _ уведомлением WM — это указатель на структуру офнотифи или офнотифекс , определяющую действие. Элемент Code в заголовке этой структуры содержит одно из следующих сообщений уведомления.
Сообщение | Значение |
---|---|
CDN _ филеок | Пользователь нащелкнул кнопку ОК ; диалоговое окно скоро закроется. |
CDN _ фолдерчанже | Пользователь открыл новую папку или каталог. |
CDN _ СПРАВКА | Пользователь щелкнул кнопку Справка . |
CDN _ инклудеитем | Определяет, должен ли отображаться элемент. Когда пользователь открывает новую папку или каталог, система отправляет это уведомление для каждого элемента в папке или каталоге. Система отправляет это уведомление только в том случае, если установлен флаг ОФН _ енаблеинклуденотифи . |
CDN _ инитдоне | Система завершила инициализацию диалогового окна, и диалоговое окно завершило обработку сообщения WM _ инитдиалог . Кроме того, система завершила компоновку элементов управления в общем диалоговом окне, чтобы освободить место для элементов управления дочернего диалогового окна (если оно есть). |
CDN _ селчанже | Пользователь выбрал новый файл или папку из списка файлов. |
CDN _ шаревиолатион | В общем диалоговом окне произошло нарушение совместного доступа к файлу, который должен быть возвращен. |
CDN _ типечанже | Пользователь выбрал новый тип файла из списка типов файлов. |
Эти сообщения WM _ Notify заменяют зарегистрированные сообщения филеокстринг, лбселчстринг, шаревистринги хелпмсгстринг , используемые предыдущими версиями диалоговых окон Открыть и Сохранить как . Однако процедура-ловушка также получает заменяемое сообщение после сообщения WM _ Notify , если обработка _ уведомления WM не использует SetWindowLong для установки ненулевого значения _ мсгресулт DWL .
Чтобы получить сведения о состоянии диалогового окна или управлении поведением и внешним видом диалогового окна, процедура-обработчик может отправить в диалоговое окно следующие сообщения.
Сообщение | Значение |
---|---|
CDM. _ FilePath | Извлекает путь и имя выбранного файла. |
CDM _ жетфолдеридлист | Извлекает список идентификаторов элементов, соответствующий текущей папке, открытой в этом диалоговом окне. Дополнительные сведения о списках идентификаторов элементов см. в разделе Введение в пространство имен оболочки. |
CDM _ GETFOLDERPATH | Возвращает путь к текущей папке или каталогу для диалогового окна. |
CDMая _ Спецификация | Извлекает имя файла (не включая путь) файла, выбранного в данный момент в диалоговом окне. |
CDM _ хидеконтрол | Скрывает указанный элемент управления. |
CDM _ сетконтролтекст | Задает текст в указанном элементе управления. |
CDM _ сетдефекст | Задает расширение имени файла по умолчанию для диалогового окна. |
Explorer-Style пользовательских шаблонов
Чтобы определить дополнительные элементы управления для диалогового окна Открытие или Сохранение в стиле обозревателя, используйте структуру OpenFileName , чтобы указать шаблон для дочернего диалогового окна, содержащего дополнительные элементы управления. Если ваш дочерний шаблон диалогового окна является ресурсом в приложении или библиотеке динамической компоновки, установите флаг ОФН _ енаблетемплате в элементе flags и используйте элементы HINSTANCE и лптемплатенаме структуры, чтобы определить имя модуля и ресурса. Если шаблон уже находится в памяти, установите флаг ОФН _ енаблетемплатехандле и используйте элемент HINSTANCE , чтобы определить объект памяти, содержащий шаблон. При предоставлении шаблона диалогового окна для диалогового окна в стиле обозревателя необходимо также установить флаг _ обозревателя ОФН . в противном случае система предполагает, что вы предоставляли шаблон замены для диалогового окна старого стиля. Как правило, при предоставлении дополнительных элементов управления необходимо также предоставить процедуру обработчика в стиле обозревателя для обработки сообщений для новых элементов управления.
Вы можете создать свой дочерний шаблон диалогового окна, как и любой другой шаблон, за исключением того, что необходимо указать стили WS _ Child и WS _ клипсиблингс и указать стили DS _ 3DLOOK и _ управления DS . Для работы системы требуется стиль _ дочернего элемента WS , так как шаблон определяет дочернее диалоговое окно открытия или сохранения по умолчанию. Стиль WS _ клипсиблингс гарантирует, что дочернее диалоговое окно не будет перерисовываться над любыми элементами управления в диалоговом окне по умолчанию. Стиль _ 3DLOOK в DS гарантирует, что внешний вид элементов управления в дочернем диалоговом окне будет соответствовать элементам управления в диалоговом окне по умолчанию. Стиль _ элемента управления DS гарантирует, что пользователь может использовать вкладку и другие клавиши навигации для перемещения между всеми элементами управления, по умолчанию или пользовательскими, в диалоговом окне настроено.
Чтобы освободить место для новых элементов управления, система раскрывает диалоговое окно по умолчанию по ширине и высоте пользовательского диалогового окна. По умолчанию все элементы управления из пользовательского диалогового окна располагаются под элементами управления в диалоговом окне по умолчанию. Однако можно переопределить это положение по умолчанию, включив Статический элемент управления «текст» в пользовательский шаблон диалогового окна и назначив ему значение идентификатора элемента управления stc32. (Это значение определено в файле заголовка Длгс. h.) В этом случае система использует элемент управления в качестве точки ссылки для определения места размещения новых элементов управления. Все новые элементы управления, расположенные выше и слева от элемента управления stc32 , располагаются в том же размере, что и слева от элементов управления в диалоговом окне по умолчанию. Новые элементы управления, расположенные ниже и справа от элемента управления stc32 , располагаются ниже и справа от элементов управления по умолчанию. Как правило, каждый новый элемент управления размещается так, чтобы его расположение совпадало с элементами управления по умолчанию, как и в элементе управления stc32 . Чтобы освободить место для этих новых элементов управления, система добавляет пробелы в левую, правую, нижнюю и верхнюю часть диалогового окна по умолчанию по мере необходимости.
Система требует, чтобы процедура обработчика обрабатывала все сообщения, предназначенные для пользовательского диалогового окна, и, таким образом, отправляет те же сообщения окна процедуре обработки, что и любые другие диалоговые окна. Например, процедура-обработчик принимает сообщения _ команды WM , когда пользователь щелкает элемент управления «Кнопка» в пользовательском диалоговом окне. Процедура-ловушка отвечает за инициализацию этих элементов управления и получение значений из элементов управления при закрытии диалогового окна. Обратите внимание, что когда процедура-обработчик получает сообщение WM _ инитдиалог , система еще не переместила элементы управления на свои конечные позиции.
Процедура диалогового окна по умолчанию обрабатывает сообщения для всех элементов управления в диалоговом окне по умолчанию, но процедура-обработчик принимает сообщения уведомления для действий пользователя с этими элементами управления, как описано в разделе процедуры обработчика в стиле обозревателя.
Идентификаторы элементов управления Explorer-Style
пакет средств разработки Windows Software Development Kit (SDK) предоставляет шаблон диалогового окна по умолчанию для диалоговых окон старого стиля, но не включает шаблон по умолчанию для диалоговых окон в стиле обозревателя. Это связано с тем, что диалоговые окна в стиле обозревателя позволяют добавлять собственные элементы управления, но не поддерживают изменение шаблона для стандартных элементов управления. Однако в некоторых случаях может потребоваться знать идентификаторы элементов управления, используемые в шаблонах по умолчанию. Например, для сообщений CDM _ Хидеконтрол и CDM _ сетконтролтекст требуется идентификатор элемента управления.
В следующей таблице показаны идентификаторы стандартных элементов управления в диалоговых окнах Открытие и Сохранение в стиле обозревателя. Идентификаторы — это константы, определенные в Длгс. h и Winuser. h.
Идентификатор элемента управления | Описание элемента управления |
---|---|
chx1 | Флажок только для чтения |
cmb1 | Раскрывающееся поле со списком, в котором отображается список фильтров типов файлов |
stc2 | Метка для поля со списком cmb1 |
cmb2 | Раскрывающийся список, отображающий текущий диск или папку, который позволяет пользователю выбрать диск или папку для открытия |
stc4 | Метка для поля со списком cmb2 |
cmb13 | Раскрывающийся список, отображающий имя текущего файла, позволяет пользователю ввести имя открываемого файла и выбрать файл, который был открыт или сохранен недавно. Это предназначено для ранее совместимых с обозревателем приложений без обработчика или шаблона диалогового окна. Сравните с edt1. |
edt1 | Элемент управления «поле ввода», который отображает имя текущего файла, или позволяет пользователю ввести имя открываемого файла. Сравните с cmb13. |
stc3 | Метка для поля со списком cmb13 и элемента управления Edit edt1 |
lst1 | Список, отображающий содержимое текущего диска или папки |
stc1 | Метка для списка lst1 |
IDOK | Кнопка « ОК » (кнопка «Отправить») |
IDCANCEL | Кнопка «Отмена» (кнопка «Отправить») |
пшхелп | Кнопка « Справка » (кнопка «Отправить») |
Настройка диалоговых окон Old-Style
Можно настроить диалоговое окно Открытие или Сохранение в старом стиле, предоставив процедуру-обработчик офнхукпроколдстиле , которая получает сообщения или уведомления, предназначенные для процедуры диалогового окна по умолчанию. Можно также указать пользовательский шаблон, который будет использоваться вместо шаблона по умолчанию. Процедуры-ловушки и шаблоны, используемые с диалоговыми окнами старого стиля, похожи на те, которые используются в других общих диалоговых окнах. Дополнительные сведения см. в разделе процедуры-обработчики для общих диалоговых окон и пользовательских шаблонов.
Чтобы включить процедуру-обработчик для диалогового окна Открытие или Сохранение в старом стиле, используйте структуру OpenFileName при создании диалогового окна. Установите флаг ОФН _ енаблехук в элементе flags и укажите адрес процедуры-обработчика офнхукпроколдстиле в элементе лпфнхук . Процедура диалогового окна отправляет в процедуру-обработчику сообщение WM _ инитдиалог с параметром param , которому задан адрес структуры OpenFileName , используемой для инициализации диалогового окна.
Структуру OpenFileName можно использовать для указания пользовательского шаблона для диалогового окна Открыть или Сохранить как , используемого вместо шаблона по умолчанию. Если пользовательский шаблон является ресурсом в приложении или библиотеке динамической компоновки, установите флаг ОФН _ енаблетемплате в элементе flags и используйте элементы HINSTANCE и лптемплатенаме структуры для обозначения имени модуля и ресурса. Если пользовательский шаблон уже находится в памяти, установите флаг ОФН _ енаблетемплатехандле и используйте элемент HINSTANCE , чтобы определить объект памяти, содержащий шаблон. Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле FileOpen. DLG. Идентификаторы элементов управления, используемые в шаблонах диалоговых окон поиска и замены по умолчанию, определяются в файле Длгс. h.
По умолчанию функции GetOpenFilename и жетсавефиленаме отображают диалоговые окна в стиле обозревателя. Если требуется отобразить диалоговое окно старого стиля, необходимо предоставить процедуру-обработчик офнхукпроколдстиле и убедиться, что флаг ОФН _ Explorer не установлен в элементе flags структуры OpenFileName .
Если установлен флаг _ обозревателя ОФН , система рассматривает процедуру-обработчик или пользовательский шаблон как настройку в стиле обозревателя. Сведения о настройке диалогового окна в стиле обозревателя см. в разделе пользовательские шаблоны в стиле обозревателя.
Источник