Sdílet prostřednictvím


Přenos shellových objektů pomocí přetahování a schránky

Mnoho aplikací umožňuje uživatelům přenášet data do jiné aplikace přetažením dat myší nebo pomocí schránky. Mezi mnoho typů dat, která je možné přenést, patří shellové objekty, jako jsou soubory nebo složky. Přenos dat shellu může probíhat mezi dvěma aplikacemi, ale uživatelé také mohou přenášet data shellu do nebo z plochy nebo Průzkumníka Windows.

I když jsou soubory nejčastěji přeneseným objektem Shell, přenos dat Shell může zahrnovat libovolný z různých objektů nalezených v prostoru názvů Shell. Aplikace může například potřebovat přenést soubor do virtuální složky, jako je Koš, nebo přijmout objekt z rozšíření oboru názvů jiného než Microsoft. Pokud implementujete rozšíření oboru názvů, musí se chovat správně jako zdroj a cíl přetažení.

Tento dokument popisuje, jak mohou aplikace implementovat přenosy dat pomocí přetažení a schránky s shell objekty.

Jak funguje přetažení s objekty prostředí

Aplikace často potřebují poskytnout uživatelům způsob, jak přenést data Shellu. Mezi příklady patří:

  • Přetažení souboru z Průzkumníka Windows nebo plochy a jeho vložení na aplikaci.
  • Zkopírování souboru do schránky v Průzkumníku Windows a jeho vložení do aplikace.
  • Přetažení souboru z aplikace do koše

Podrobnou diskuzi o tom, jak tyto a další scénáře zpracovat, najdete v tématu Zpracování scénářů přenosu dat prostředí. Tento dokument se zaměřuje na obecné principy přenosu dat Shellu.

Systém Windows poskytuje dva standardní způsoby pro přenos dat shellu aplikacím:

  • Uživatel vyjme nebo zkopíruje data systému, například jeden či více souborů, do schránky. Druhá aplikace načte data ze schránky.
  • Uživatel přetáhne ikonu, která představuje data ze zdrojové aplikace, a ikonu zahodí do okna vlastněného cílem.

V obou případech jsou přenášená data obsažena v datovém objektu. Datové objekty jsou objekty MODELU COM (Component Object Model), které zpřístupňují rozhraní IDataObject. Schematicky existují tři základní kroky, které musí všechny přenosy dat Shell dodržovat:

  1. Zdroj vytvoří datový objekt, který představuje data, která se mají přenést.
  2. Cíl obdrží ukazatel na rozhraní datového objektu IDataObject.
  3. Cíl volá rozhraní IDataObject, které z něj extrahuje data.

Rozdíl mezi přenosy dat ze schránky a přetahováním dat spočívá především v tom, jak se IDataObject ukazatel přenáší ze zdroje do cíle.

Přenosy dat schránky

Schránka je nejjednodušší způsob přenosu dat prostředí Shell. Základní postup je podobný standardním přenosům dat ze schránky. Vzhledem k tomu, že přenášíte ukazatel na datový objekt, nikoli samotná data, musíte místo standardního rozhraní API schránky použít rozhraní API schránky OLE. Následující postup popisuje, jak pomocí rozhraní API schránky OLE přenášet data prostředí Shell pomocí schránky.

  1. Zdroj dat vytvoří datový objekt, který bude obsahovat data.
  2. Zdroj dat volá OleSetClipboard, který umístí ukazatel na rozhraní IDataObject objektu dat ve schránce.
  3. Cíl volá OleGetClipboard načíst ukazatel na rozhraní IDataObject datového objektu.
  4. Cíl extrahuje data voláním metody IDataObject::GetData.
  5. U některých přenosů dat pomocí Shell může být také potřeba, aby cílový objekt volal metodu IDataObject::SetData, aby poskytl zpětnou vazbu datovému objektu ohledně výsledku přenosu dat. Příklad tohoto typu operace najdete v tématu zpracování optimalizovaných operací přesunutí.

Přenosy dat metodou drag & drop

I když je poněkud složitější implementovat, přenos dat přetažením má oproti schránce některé významné výhody:

  • Přenosy metodou drag-and-drop lze provádět jednoduchým pohybem myši, což usnadňuje práci a je flexibilnější a intuitivnější k použití než Schránka.
  • Funkce přetažení poskytuje uživateli vizuální zpětnou vazbu o operaci. Uživatel může sledovat ikonu při přesouvání ze zdroje na cíl.
  • Při přetahování se cílový objekt upozorní, jakmile jsou data k dispozici.

Operace přetahování rovněž využívají datové objekty k přenosu informací. Zdroj drop však musí poskytovat funkce nad rámec toho, co je vyžadováno pro přenosy schránky:

  • Zdroj přetažení musí také vytvořit objekt, který zveřejňuje IDropSource rozhraní. Systém používá IDropSource ke komunikaci se zdrojem v průběhu operace.
  • Objekt přetažení je zodpovědný za sledování pohybu kurzoru a zobrazení ikony, která představuje datový objekt.

Cíle pro přetažení musí také poskytovat více funkcí, než je potřeba pro zpracování přenosů ze schránky.

  • Cíl přetažení musí zveřejnit rozhraní IDropTarget. Když je kurzor nad cílovým oknem, systém používá IDropTarget k poskytnutí cíli informací, jako je pozice kurzoru, a upozorní ho, když jsou data upustěna.
  • Cíl odstranění se musí zaregistrovat v systému voláním RegisterDragDrop. Tato funkce poskytuje systému popisovač cílového okna a ukazatel na rozhraní IDropTarget cílové aplikace.

Poznámka

U operací přetažení musí aplikace inicializovat COM s OleInitialize, nikoli CoInitialize.

 

Následující postup popisuje základní kroky, které se obvykle používají k přenosu dat přetažením.

  1. Cíl volá RegisterDragDrop, aby systému poskytl ukazatel na jeho IDropTarget rozhraní a zaregistroval okno jako cíl pro vložení.
  2. Když uživatel spustí operaci přetažení, zdroj vytvoří datový objekt a zahájí přetažení smyčky voláním DoDragDrop.
  3. Když je kurzor nad cílovým oknem, systém upozorní cíl zavoláním jedné z IDropTarget metod. Systém volá IDropTarget::DragEnter, když kurzor vstoupí do cílového okna, a IDropTarget::DragOver při průchodu kurzorem přes cílové okno. Obě metody poskytují cíl přetažení s aktuální polohou kurzoru a stavem modifikačních kláves klávesnice, například CTRL nebo ALT. Když kurzor opustí cílové okno, systém upozorní cíl voláním IDropTarget::DragLeave. Když se některá z těchto metod vrátí, rozhraní IDropSource volá systém pro předání návratové hodnoty do zdroje.
  4. Když uživatel uvolní tlačítko myši pro přenesení dat, systém zavolá metodu IDropTarget::Drop. Mezi parametry metody je ukazatel na rozhraní datového objektu IDataObject.
  5. Cíl volá metodu objektu dat IDataObject::GetData pro extrahování dat.
  6. U některých přenosů dat Shellu může být také potřeba zavolat metodu objektu dat IDataObject::SetData, aby poskytla zpětnou vazbu ke zdroji o výsledku přenosu dat.
  7. Když cíl dokončí práci s datovým objektem, vrátí se z IDropTarget::Drop. Systém vrátí volání DoDragDrop zdroji, které ho informuje o dokončení přenosu dat.
  8. V závislosti na konkrétním scénáři přenosu datmůže zdroj muset provést další akci na základě hodnoty vrácené DoDragDrop a hodnot, které jsou předány datovému objektu cílem. Například při přesunutí souboru musí zdroj zkontrolovat tyto hodnoty a určit, zda musí odstranit původní soubor.
  9. Zdroj uvolní datový objekt.

Přestože výše uvedené postupy poskytují dobrý obecný model pro přenos dat Shell, existuje mnoho různých typů dat, které mohou být obsaženy v datovém objektu Shell. Existuje také řada různých scénářů přenosu dat, které může vaše aplikace potřebovat zpracovat. Každý datový typ a scénář vyžaduje poněkud jiný přístup ke třem klíčovým krokům v postupu:

  • Způsob vytvoření datového objektu, který bude obsahovat data prostředí
  • Jak cíl extrahuje Shell data z datového objektu.
  • Jak zdroj dokončí operaci přenosu dat.

Datový objekt Shell poskytuje obecnou diskusi o tom, jak zdroj vytváří Shell datový objekt a jak lze tento datový objekt zpracovat cílem. Řešení scénářů přenosu dat ve Shellu podrobně popisuje, jak zpracovat řadu běžných scénářů přenosu dat.