Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.6(shell).doc
Скачиваний:
95
Добавлен:
18.05.2015
Размер:
1.12 Mб
Скачать

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;

}

}

Соседние файлы в папке ОСиСП - методички