- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Обработчики сообщений страницы свойств
Много важного происходит в OnInitDialog(). Параметр lParam опять указывает на структуру PROPSHEETPAGE, использовавшуюся при создании вкладки. Ее член lParam указывает на это вездесущее "имя файла". Поскольку нам необходимо иметь доступ к имени файла в функции OnApply(), мы сохраняем указатель, используя SetWindowLong().
|
BOOL OnInitDialog ( HWND hwnd, LPARAM lParam ) { PROPSHEETPAGE* ppsp = (PROPSHEETPAGE*) lParam; LPCTSTR szFile = (LPCTSTR) ppsp->lParam; HANDLE hFind; WIN32_FIND_DATA rFind;
// Сохраним имя файла в данных этого окна для дальнейшего использования SetWindowLong ( hwnd, GWL_USERDATA, (LONG) szFile ); |
Затем мы получаем времена создания, модификации и доступа, используя FindFirstFile(). Если это выполнено успешно, DTP инициализируются правильными данными.
|
hFind = FindFirstFile ( szFile, &rFind );
if ( INVALID_HANDLE_VALUE != hFind ) { // Инициализируем DTP SetCombinedDateTime ( hwnd, IDC_MODIFIED_DATE, IDC_MODIFIED_TIME, &rFind.ftLastWriteTime );
SetCombinedDateTime ( hwnd, IDC_ACCESSED_DATE, 0, &rFind.ftLastAccessTime );
SetCombinedDateTime ( hwnd, IDC_CREATED_DATE, IDC_CREATED_TIME, &rFind.ftCreationTime );
FindClose ( hFind ); } |
SetCombinedDateTime() - прикладная функция, которая устанавливает содержимое DTP. Код можно найти в конце FileTimeShlExt.cpp.
И в дополнение - полный путь к файлу показывается в надписи вверху страницы.
|
PathSetDlgItemPath ( hwnd, IDC_FILENAME, szFile );
return FALSE; // Используем встроенную обработку фокуса } |
Обработчик OnApply() напротив, читает информацию из DTP и устанавливает времена создания, модификации и доступа к файлам. Первый шаг - получить при помощи GetWindowLong() указатель на имя файла и открыть файл для записи.
|
BOOL OnApply ( HWND hwnd, PSHNOTIFY* phdr ) { LPCTSTR szFile = (LPCTSTR) GetWindowLong ( hwnd, GWL_USERDATA ); HANDLE hFile; FILETIME ftModified, ftAccessed, ftCreated;
// Открываем файл hFile = CreateFile ( szFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); |
Если мы смогли открыть файл, считываем из DTP и пишем времена обратно в файл. GetCombinedDateTime() это пара для SetCombinedDateTime().
|
if ( INVALID_HANDLE_VALUE != hFile ) { // Извлекаем дату и время из DTP GetCombinedDateTime ( hwnd, IDC_MODIFIED_DATE, IDC_MODIFIED_TIME, &ftModified );
GetCombinedDateTime ( hwnd, IDC_ACCESSED_DATE, 0, &ftAccessed );
GetCombinedDateTime ( hwnd, IDC_CREATED_DATE, IDC_CREATED_TIME, &ftCreated );
// Изменяем время создания, доступа и последней модификации файла SetFileTime ( hFile, &ftCreated, &ftAccessed, &ftModified ); CloseHandle ( hFile ); } else { // <<Обработка ошибок опущена>> }
// Возвращаем PSNRET_NOERROR, чтобы можно было закрыть набор свойств, если пользователь нажал OK. SetWindowLong ( hwnd, DWL_MSGRESULT, PSNRET_NOERROR ); return TRUE; } |
