Shell-objektumok átvitele húzással és a vágólap használatával
Számos alkalmazás lehetővé teszi, hogy a felhasználók az adatok egérrel vagy a vágólap használatával történő húzásával átvihessenek adatokat egy másik alkalmazásba. Az átvitt adatok számos típusa közé tartoznak a Shell-objektumok, például fájlok vagy mappák. A Shell-adatátvitel két alkalmazás között történhet, de a felhasználók a Shell-adatokat az asztalra vagy a Windows Intézőbe is átvihetik.
Bár a fájlok a leggyakrabban átvitt Shell-objektumok, a Shell-adatátvitel a Shell-névtértalálható objektumok bármelyikét magában foglalhatja. Előfordulhat például, hogy az alkalmazásnak át kell vinnie egy fájlt egy virtuális mappába, például a Lomtárba, vagy el kell fogadnia egy objektumot egy nem Microsoft-névtérkiterjesztésből. Ha egy névtérbővítményt implementál, képesnek kell lennie arra, hogy megfelelően viselkedjen drop source és targetként.
Ez a dokumentum azt ismerteti, hogy az alkalmazások hogyan valósíthatnak meg húzási és vágólapos adatátvitelt Shell-objektumokkal.
Hogyan működik a húzás és ejtés a Shell-objektumokkal
Az alkalmazásoknak gyakran meg kell adniuk a felhasználóknak a Shell-adatok átvitelének módját. Néhány példa:
- Fájl húzása a Windows Intézőből vagy az asztalról, majd egy alkalmazásra való áthelyezése.
- Fájl másolása a Vágólapra a Windows Intézőben, majd beillesztése egy alkalmazásba.
- Fájl húzása egy alkalmazásból a Lomtárba.
Ezen és egyéb forgatókönyvek kezelésének részletes ismertetését Shell-adatátviteli forgatókönyvek kezelésecímű témakörben találja. Ez a dokumentum a Shell-adatátvitel mögötti általános alapelvekre összpontosít.
A Windows két szabványos módszert biztosít az alkalmazások számára a Shell-adatok átvitelére:
- A felhasználó kivágja vagy átmásolja a Shell-adatokat, például egy vagy több fájlt a vágólapra. A másik alkalmazás lekéri az adatokat a vágólapról.
- A felhasználó húz egy ikont, amely a forrásalkalmazásból származó adatokat jelöli, és az ikont a cél tulajdonában lévő ablakra dobja.
Az átvitt adatokat mindkét esetben egy adatobjektumtartalmazza. Az adatobjektumok olyan com-komponensobjektum-objektumok, amelyek elérhetővé teszik a IDataObject felületet. Séma szerint három alapvető lépést kell követnie az összes Shell-adatátvitelnek:
- A forrás létrehoz egy adatobjektumot, amely az átvitt adatokat jelöli.
- A cél az adatobjektum IDataObject felületére mutató mutatót kap.
- A cél meghívja az IDataObject felületet, hogy kinyerje belőle az adatokat.
A vágólap és az áthúzásos adatátvitel közötti különbség elsősorban abban rejlik, hogy a IDataObject mutatót a forrásból a célba juttatják.
Vágólap adatátvitele
A vágólap a legegyszerűbb módja a Shell-adatok átvitelének. Az alapművelet hasonló a szokásos vágólap-adatátvitelhez. Mivel azonban egy mutatót egy adatobjektumba visz át, nem magát az adatokat, a szokásos vágólap API helyett az OLE vágólap API-t kell használnia. Az alábbi eljárás azt ismerteti, hogyan használhatja az OLE vágólap API-t a Shell-adatok vágólapra való átviteléhez:
- Az adatforrás létrehoz egy adatobjektumot, amely tartalmazza az adatokat.
- Az adatforrás meghívja OleSetClipboard, amely mutatót helyez az adatobjektum IDataObject felületére a vágólapon.
- A célpont hívja a OleGetClipboard, hogy lekérje az adatobjektum IDataObject interfészére mutató mutatót.
- A cél a IDataObject::GetData metódus meghívásával nyeri ki az adatokat.
- Egyes Shell-adatátvitelek esetén előfordulhat, hogy a célnak meg kell hívnia az adatobjektum IDataObject::SetData metódust is, hogy visszajelzést küldjön az adatobjektumnak az adatátvitel eredményéről. Erre a művelettípusra példát Az optimalizált áthelyezési műveletek kezelése című témakörben talál.
Húzd és vidd adatátvitel
Bár némileg összetettebb a megvalósítás, a húzással végzett adatátvitelnek jelentős előnye van a vágólapon:
- A húzással végzett átvitel egyszerű egérmozgatással végezhető el, így a művelet rugalmasabb és intuitívabb, mint a vágólap.
- A húzd-és-ejtsd funkció vizuális ábrázolást nyújt a felhasználó számára a műveletről. A felhasználó követheti az ikont, ahogy a forrásból a célba lép.
- Az húzással értesítést küld a célnak, ha az adatok elérhetők.
A húzd és ejtsd műveletek adatobjektumokat használnak az adatok továbbításához. Az elvetés forrásának azonban olyan funkciókat kell biztosítania, amelyek túlmutatnak a vágólap átviteléhez szükségeseken.
- A cseppforrásnak létre kell hoznia egy objektumot is, amely egy IDropSource felületet tesz elérhetővé. A rendszer IDropSource használ a forrással való kommunikációhoz, amíg a művelet folyamatban van.
- A kurzor mozgásának nyomon követéséért és az adatobjektumot ábrázoló ikon megjelenítéséért a húzás és ejtés adatobjektum felel.
Az elejtési céloknak a vágólap átvitelének kezeléséhez szükségesnél több funkciót is biztosítaniuk kell:
- A célnak el kellérhetővé tennie egy IDropTarget felületet. Amikor a kurzor egy célablak felett van, a rendszer az IDropTarget használatával adja meg a célnak az olyan információkat, mint a kurzor pozíciója, és értesítést küld az adatok elvetésekor.
- A dobási célnak regisztrálnia kell magát a rendszerben RegisterDragDropmeghívásával. Ez a függvény egy célablak fogópontját és a célalkalmazás IDropTarget felületére mutató mutatót biztosít a rendszer számára.
Jegyzet
A húzási műveletekhez az alkalmazásnak inicializálnia kell a COM-t OleInitializehasználatával, nem pedig CoInitialize.
Az alábbi eljárás azokat az alapvető lépéseket ismerteti, amelyeket általában a Shell-adatok húzással történő átvitelére használnak:
- A cél meghívja RegisterDragDrop, hogy a rendszer mutatót adjon a IDropTarget felületére, és regisztráljon egy ablakot drop targetként.
- Amikor a felhasználó elindít egy húzási műveletet, a forrás létrehoz egy adatobjektumot, és elindít egy húzási ciklust a DoDragDropmeghívásával.
- Ha a kurzor a célablak felett van, a rendszer értesíti a célról a cél IDropTarget metódusok meghívásával. A rendszer meghívja IDropTarget::D ragEnter, amikor a kurzor belép a célablakba, és IDropTarget::D ragOver, amikor a kurzor áthalad a célablakon. Mindkét módszer biztosítja a célhelyet a kurzor aktuális pozíciójával és a billentyűzet módosító billentyűinek (például a CTRL vagy az ALT) állapotával. Amikor a kurzor elhagyja a célablakot, a rendszer értesíti a célt a IDropTarget::DragLeavemeghívásával. Amikor ezek a metódusok bármelyike visszatér, a rendszer meghívja a IDropSource interfészt, hogy átadja a visszatérési értéket a forrásnak.
- Amikor a felhasználó felengedi az egérgombot az adatok elhelyezéséhez, a rendszer meghívja a cél IDropTarget::Drop metódust. A metódus paraméterei között található egy mutató az adatobjektum IDataObject felületére.
- A cél meghívja az adatobjektum IDataObject::GetData metódust az adatok kinyeréséhez.
- Egyes Shell-adatátvitelek esetén előfordulhat, hogy a célnak meg kell hívnia az adatobjektum IDataObject::SetData metódust is, hogy visszajelzést küldjön a forrásnak az adatátvitel eredményéről.
- Amikor a cél befejezi az adatobjektummal végzett munkát, visszatér a IDropTarget::Drop. A rendszer visszaadja a forrás DoDragDrop hívását, amely értesíti a forrást az adatátvitel befejezéséről.
- Az adatátviteli forgatókönyvtőlfüggően előfordulhat, hogy a forrásnak további műveleteket kell végrehajtania a DoDragDrop által visszaadott érték és a cél által az adatobjektumnak átadott értékek alapján. Ha például áthelyez egy fájlt, a forrásnak ellenőriznie kell ezeket az értékeket annak megállapításához, hogy törölnie kell-e az eredeti fájlt.
- A forrás felszabadítja az adatobjektumot.
Bár a fent ismertetett eljárások jó általános modellt biztosítanak a Shell-adatátvitelhez, számos különböző típusú adat található egy Shell-adatobjektumban. Az alkalmazásnak számos különböző adatátviteli forgatókönyvet is kezelnie kell. Minden adattípushoz és forgatókönyvhez némileg eltérő megközelítésre van szükség az eljárás három fő lépéséhez:
- Hogyan hoz létre egy forrás egy adatobjektumot a Shell-adatok kezeléséhez.
- Hogyan nyeri ki a cél a Shell-adatokat az adatobjektumból.
- Hogyan hajtja végre a forrás az adatátviteli műveletet.
A Shell-adatobjektum általános tájékoztatást nyújt arról, hogy egy forrás hogyan építi fel a Shell-adatobjektumokat, és hogy az adatobjektum hogyan kezelhető a cél által. Shell-adatátviteli forgatókönyvek kezelése részletesen ismerteti számos gyakori Shell-adatátviteli forgatókönyv kezelését.