Фильтры


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

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

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

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

Обратите внимание! на то, что пробелы в строке образца могут привести к непредвиденным результатам.

Фрагмент кода ниже определяет два фильтра. Фильтр с описанием "Источник" ("Source") имеет два трафарета. Если пользователь выбирает этот фильтр, диалоговое окно показывает только файлы, которые имеют .C и .CXX расширения.

Обратите внимание! на то, что в языке программирования C строка, заключается двойными кавычками после символа конца строки ('0').

 

OPENFILENAME ofn;       // структура стандартного диалогового окна

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

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

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

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

Уведомляющее сообщение CDN_INCLUDEITEM предусматривает другой способ  фильтрации имен, которые диалоговое окно показывает на экране. Чтобы использовать это сообщение, предусмотрите фильтр (hook) - процедуру событий OFNHOOKPROC и установите флажок OFN_ENABLEINCLUDENOTIFY в структуре OPENFILENAME, когда создаете диалоговое окно. Каждый раз, когда пользователь открывает папку, диалоговое окно отправляет уведомление CDN_INCLUDEITEM вашей фильтр (hook) - процедуре событий о каждом пункте в недавно открытой папке. Возвращаемое значение фильтр (hook) - процедуры указывает, должно ли диалоговое окно показать на экране пункт в списке элементов папки.

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz