- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
DragEnter()
Прототип функции:
|
HRESULT IDropTarget::DragEnter ( IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ); |
pDataObj - указатель на интерфейс IDataObject, с помощью которого мы перечисляем имена перетаскиваемых файлов. grfKeyState - установка флагов, сигнализирующих, какие shift-клавиши и кнопки мыши были нажаты. (Я не знаю, что означает префикс "gr", может имеется ввиду "group of flags"?) pt - это структура POINTL (бывает и POINT), которая хранит координаты мыши. pdwEffect - указатель на DWORD, в котором мы возвратим значение, сообщающее проводнику, примем ли мы брошенные файлы, и если так, какой вид будет иметь иконка, которая перекроет курсор мыши.
Как я упоминал раньше, DragEnter() вообще-то вызывается, когда пользователь заносит файл над целью. Однако этот метод также вызывается, когда пользователь щелкает на пункте меню Send To, поэтому мы все еще можем сделать всю нашу работу в DragEnter(), хотя технически это не случай drag and drop.
Наша реализация DragEnter() заполнит строковый список именами перетаскиваемых файлов. Это расширение примет все файлы или каталоги, т.к. любые объекты файловой системы могут быть скопированы или перемещены.
DragEnter() начинается со знакомых вам действий - мы подключаем COleDataObject к интерфейсу IDataObject, и перечисляем перетаскиваемые файлы.
|
HRESULT CSendToShlExt::DragEnter ( IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // init MFC
COleDataObject dataobj; TCHAR szItem [MAX_PATH]; UINT uNumFiles; HGLOBAL hglobal; HDROP hdrop;
dataobj.Attach ( pDataObj, FALSE ); // attach to the IDataObject, don't auto-release it
// Read the list of items from the data object. They're stored in HDROP // form, so just get the HDROP handle and then use the drag 'n' drop APIs // on it.
hglobal = dataobj.GetGlobalData ( CF_HDROP );
if ( NULL != hglobal ) { hdrop = (HDROP) GlobalLock ( hglobal );
uNumFiles = DragQueryFile ( hdrop, 0xFFFFFFFF, NULL, 0 );
for ( UINT uFile = 0; uFile < uNumFiles; uFile++ ) { if ( 0 != DragQueryFile ( hdrop, uFile, szItem, MAX_PATH )) { m_lsDroppedFiles.AddTail ( szItem ); } }
GlobalUnlock ( hglobal ); } |
Настало время возвратить значение через pdwEffect. Возвращаемое значение может быть таким:
DROPEFFECT_COPY: Сказать проводнику, что перетаскиваемые файлы будут скопированы нашим расширением.
DROPEFFECT_MOVE: Сказать проводнику, что перетаскиваемые файлы будут перемещены нашим расширением.
DROPEFFECT_LINK: Сказать проводнику, что перетаскиваемые файлы будут связаны нашим расширением.
DROPEFFECT_NONE: Сказать проводнику, что перетаскиваемые файлы не будут приняты.
Мы будем возвращать только DROPEFFECT_COPY. Мы не можем вернуть DROPEFFECT_MOVE, т.к. проводник бы удалил перетаскиваемые файлы. Мы могли бы вернуть DROPEFFECT_LINK, но тогда курсор имел бы маленькую стрелочку, что обычно обозначает ярлычки, и это вводило бы в заблуждение пользователя. Если список файлов пуст, что бывает, когда мы не можем прочитать буфер обмена, мы возвращаем DROPEFFECT_NONE, чтобы сказать проводнику, что мы не примем переброску.
|
if ( m_lsDroppedFiles.GetCount() > 0 ) { *pdwEffect = DROPEFFECT_COPY; return S_OK; } else { *pdwEffect = DROPEFFECT_NONE; return E_INVALIDARG; } } |
