- •Методические указания для выполнения лабораторной работы №2.6 по курсу «Операционные системы и системное программирование»
- •Цель работы
- •Теоретические сведения
- •Пример 1 «Добавление пунктов в контекстное меню для отдельных расширений файлов»
- •Использование AppWizard.
- •Интерфейс инициализации
- •Интерфейс взаимодействия с контекстным меню
- •Модификация контекстного меню
- •Отображение подсказки в строке состояния
- •Выполнение выбора пользователя
- •Регистрация расширения оболочки
- •Отладка расширения оболочки
- •Результат
- •Пример 2 «Добавление пунктов в контекстное меню для всех файлов не зависимо от расширения»
- •Дополнительные функции расширения, добавляющего пункты к контекстному меню оболочки.
- •Использование AppWizard
- •Интерфейс инициализации
- •Добавление пунктов к меню
- •Подсказка в строке состояния и "действие"
- •Выполнение выбора пользователя
- •Регистрация расширения
- •Результат
- •Другие способы регистрации расширения
- •Пример 3 «Использование разделяемой с оболочкой памяти»
- •Расширение QueryInfo
- •Использование AppWizard
- •Интерфейс инициализации
- •Создание текста для тултипа
- •Регистрация расширения оболочки
- •Пример 4 «Обработчик перетаскивания контекстного меню»
- •Обработчик перетаскивания
- •Интерфейс инициализации
- •Модификация контекстного меню
- •Создание связи
- •Обеспечение подсказки в строке состояния
- •Создание связи
- •Регистрация расширения
- •Пример 5 «Добавления новых страниц в набор свойств файлов»
- •Обработчик набора свойств
- •Использование AppWizard
- •Интерфейс инициализации
- •Добавление страниц свойств
- •Неприятная ситуация с периодом жизни объектов
- •Функции обратного вызова страницы свойств
- •Обработчики сообщений страницы свойств
- •Регистрация расширения
- •Пример 6 «Обработчик сбрасывания в меню Send To»
- •Обработчик сбрасывания
- •Использование AppWizard
- •Интерфейс инициализации
- •Участвуем в операции drag and drop
- •DragEnter()
- •DragLeave()
- •Регистрация расширения
- •Пример 7 «Owner-drawn меню в расширениях контекстных меню и по созданию расширения контекстного меню, которое отзывается на правый щелчок на фоне окна каталога» Расширение 1 - Пункты меню owner-drawn.
- •Использование AppWizard
- •Интерфейс инициализации.
- •Взаимодействие с контекстным меню
- •Модифицирование контекстного меню.
- •Отображение всплывающей подсказки в строке состояния.
- •Выполнение выбора пользователя.
- •Рисование пункта меню.
- •Обработка wm_measureitem
- •Обработка wm_drawitem
- •Регистрация расширения оболочки
- •Расширение 2 - Обработка щелчка правой кнопкой мыши на фоне окна каталога.
- •Отличия в iShellExtInit::Initialize()
- •Отличия в регистрации.
- •Пример 8 «Добавление колонки в окно детального просмотра Проводника» Детальный просмотр в Windows 2000
- •Использование AppWizard
- •Интерфейс расширения
- •Инициализация
- •Перечисление новых столбцов
- •Отображение данных в столбцах
- •Небольшое отступление - обработка тэгов id3
- •Как это все выглядит?
- •Регистрация расширения оболочки
- •Еще одна полезная штучка - InfoTips
- •Пример 9 «Настройка иконок, отображаемых для файлов заданного типа» Файловые иконки в Проводнике
- •Использование AppWizard
- •Интерфейс расширения
- •Интерфейс инициализации
- •Интерфейс iExtractIcon
- •Извлечение методом 1
- •Извлечение методом 2
- •Регистрация расширения
- •Пример 10 «Расширение оболочки для изменения иконок у dll в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Как это все выглядит?
Наши новые столбцы появляются в конце списка в диалоге "Настройка cтолбцов":
Вот как выглядят столбцы. Файлы сортируются по заполненному нами столбцу Author.
Регистрация расширения оболочки
Так как наш обработчик расширяет возможности папок, он регистрируется под ключом HKCR\Folders. Вот секция для добавления к RGS файлу, который зарегистрирует наше расширение:
|
HKCR { NoRemove Folder { NoRemove Shellex { NoRemove ColumnHandlers { ForceRemove {AC146E80-3679-4BCA-9BE4-E36512573E6C} = s 'MP3 ID3v1 viewer column ext' } } } } |
Еще одна полезная штучка - InfoTips
Другая интересная вещь, которую может делать наш обработчик - настраивать всплывающее описание, InfoTip, для файла заданного типа. Вот RGS-сценарий, который создает заказной InfoTip для MP3 файлов:
|
HKCR { NoRemove .mp3 { val InfoTip = s 'prop:Type;Author;Title;Comment;{AC146E80-3679-4BCA-9BE4-E36512573E6C},0;{AC146E80-3679-4BCA-9BE4-E36512573E6C},1;{AC146E80-3679-4BCA-9BE4-E36512573E6C},2;Size' } } |
Обратите внимание, что поля Author, Title, и Comment указаны в строке prop:. Когда Вы задерживаете курсор мыши над MP3 файлом, Проводник вызывает наше расширение, чтобы получить и показать строки из этих полей. Документация в MSDN утверждает, что наши заказные поля также могут появляться в InfoTips (именно поэтому наш GUID и идентификаторы свойств появились в вышеприведенной строке), однако, в Win2K это не работает. Только встроенные свойства появляются в InfoTips. Вот как выглядит InfoTip:
Пример 9 «Настройка иконок, отображаемых для файлов заданного типа» Файловые иконки в Проводнике
Все знают, что каждый тип файла представлен в Проводнике конкретной иконкой. BMP файлы показываются со значком "кисти в краске", HTML страницы - значком "страничка с логотипом IE" и т.д. Проводник определяет какую иконку использовать просматривая реестр и читая ключ под HKEY_CLASSES_ROOT, связанный с данным типом файлов. В результате использования этого метода одна иконка ассоциируется со всеми файлами конкретного типа.
Однако это не единственный путь для задания вида иконки. Проводник позволяет настраивать вид иконки от файла к файлу при помощи соответствующего расширения. Фактически такой пример уже встроен в Windows. Откройте в Проводнике каталог Windows (или любой другой каталог, содержащий много EXE файлов) и вы увидите, что каждый EXE файл имеет собственную иконку. (За исключением EXE файлов, ресурсы которых не содержат иконок. Для них генерируется одна общая иконка.)
Демонстрационный проект этой статьи - расширение, отображающее для текстового файла одну из четырех иконок в зависимости от размера этого файла. Отображаются следующие иконки:
![]()
- 8K или больше
![]()
- от 4K до 8K
![]()
- от 1 байта до 4K
![]()
- 0 байт
Использование AppWizard
Запустите AppWizard и создайте новый ATL COM проект. Назовем его TxtFileIcons. Щелкните ОК, чтобы перейти к первому (и единственному) диалогу мастера. Сохраните все установки по умолчанию и щелкните Finish. Теперь у нас есть пустой ATL проект, который построит DLL, но нам необходимо еще добавить наш COM объект-расширение. В дереве ClassView щелкните правой кнопкой мыши на пункте TxtFileIcons classes и укажите New ATL Object.
В мастере ATL Object на первой панели уже выбран Simple Object, поэтому просто щелкните Next. На второй панели в поле редактирования Short Name введите TxtIconShlExt и щелкните ОК (остальные поля заполнятся автоматически). Эти действия создадут класс CTxtIconShlExt, который содержит основной код для реализации COM объектов. Мы добавим наш код в этот класс.
