Megosztás a következőn keresztül:


Vágólapműveletek

Az ablaknak a vágólapot kell használnia adatok kivágásakor, másolásakor vagy beillesztésekor. Egy ablak adatokat helyez el a vágólapon a kivágási és másolási műveletekhez, és beolvassa az adatokat a vágólapról beillesztési műveletekhez. A következő szakaszok ezeket a műveleteket és a kapcsolódó problémákat ismertetik.

Ha adatokat szeretne elhelyezni a vágólapon, vagy adatokat szeretne lekérni, az ablaknak először meg kell nyitnia a vágólapot az OpenClipboard függvénnyel. Egyszerre csak egy ablak nyithatja meg a vágólapot. Ha meg szeretné tudni, hogy melyik ablakban van megnyitva a vágólap, hívja meg a GetOpenClipboardWindow függvényt. Ha elkészült, az ablaknak be kell zárnia a vágólapot a CloseClipboard függvény meghívásával.

Ebben a szakaszban az alábbi témaköröket tárgyaljuk.

Kivágási és másolási műveletek

Ha adatokat szeretne elhelyezni a vágólapon, az ablak először törli a vágólap tartalmát a EmptyClipboard függvénnyel. Ez a függvény elküldi a WM_DESTROYCLIPBOARD üzenetet az előző vágólap tulajdonosának, felszabadítja a vágólap adataihoz társított erőforrásokat, és hozzárendeli a vágólap tulajdonjogát ahhoz az ablakhoz, amelyen meg van nyitva a vágólap. Ha meg szeretné tudni, hogy melyik ablak a vágólap tulajdonosa, hívja meg a GetClipboardOwner függvényt.

A vágólap kiürítése után az ablak a lehető legtöbb vágólapformátumban helyezi el az adatokat a vágólapon, a legleíróbb vágólap formátumból a legkevésbé leíró formátumba rendezve. Minden formátum esetében az ablak meghívja a SetClipboardData függvényt, megadva a formátumazonosítót és a globális memóriakezelőt. A memóriafogantyú null értékű lehet, ami azt jelzi, hogy az ablak kérésre jeleníti meg az adatokat. További információ: Késleltetett renderelés.

Beillesztési műveletek

A vágólapról történő beillesztési adatok lekéréséhez először egy ablak határozza meg a beolvasandó vágólap formátumát. Az ablak általában az EnumClipboardFormats függvénnyel számba veszi az elérhető vágólapformátumokat, és az első által felismert formátumot használja. Ez a módszer a legjobban elérhető formátumot választja ki a prioritási csoportnak megfelelően, amikor az adatok a vágólapra kerültek.

Másik lehetőségként egy ablak használhatja a GetPriorityClipboardFormat függvényt. Ez a függvény egy megadott prioritás alapján azonosítja a legjobban elérhető vágólapformátumot. Egy olyan ablak, amely csak egy vágólapformátumot ismer fel, egyszerűen meghatározhatja, hogy ez a formátum elérhető-e az IsClipboardFormatAvailable függvénnyel.

A használni kívánt vágólapformátum meghatározása után egy ablak meghívja a GetClipboardData függvényt. Ez a függvény visszaadja a leírót egy globális memóriaobjektumnak, amely a megadott formátumban tartalmaz adatokat. Az ablakok rövid időre zárolhatják a memóriaobjektumot az adatok vizsgálatához vagy másolásához. Egy ablak azonban nem szabadíthatja fel az objektumot, és nem hagyhatja hosszú ideig zárolva.

Vágólap tulajdonjoga

A vágólap tulajdonosa a vágólap adataihoz társított ablak. Az ablak lesz a vágólap tulajdonosa, amikor adatokat helyez el a vágólapon, különösen akkor, amikor meghívja a EmptyClipboard függvényt. Az ablak marad a vágólap tulajdonosa, amíg be nem zárja, vagy egy másik ablak kiüríti a vágólapot.

A vágólap kiürítésekor a vágólap tulajdonosa WM_DESTROYCLIPBOARD üzenetet kap. Az alábbiakban néhány oka lehet annak, hogy egy ablak feldolgozhatja ezt az üzenetet:

  • Az ablak egy vagy több vágólapformátum megjelenítését késleltette. A WM_DESTROYCLIPBOARD üzenetre válaszul előfordulhat, hogy az ablak felszabadítja azokat az erőforrásokat, amelyek az adatok kérésre való megjelenítéséhez lettek lefoglalva. Az adatok megjelenítéséről további információt a Késleltetett rendereléscímű témakörben talál.
  • Az ablak privát vágólap formátumban helyezte el az adatokat a vágólapon. A privát vágólapformátumok adatait a rendszer nem szabadít fel a vágólap kiürítésekor. Ezért a vágólap tulajdonosának szabaddá kell tennie az adatokat a WM_DESTROYCLIPBOARD üzenet fogadásakor. További információ a privát vágólapformátumokról: Vágólapformátumok.
  • Az ablak a vágólapra helyezte az adatokat a CF_OWNERDISPLAY vágólap formátumával. A WM_DESTROYCLIPBOARD üzenetre válaszul előfordulhat, hogy az ablak felszabadítja azokat az erőforrásokat, amelyeket a vágólapmegjelenítő ablakban az információk megjelenítéséhez használt. Erről az alternatív formátumról további információt Tulajdonos megjelenítési formátumacímű témakörben talál.

Késleltetett renderelés

Ha vágólapformátumot helyez el a vágólapon, az ablak késleltetheti az adatok ilyen formátumban való megjelenítését, amíg az adatokra nincs szükség. Ehhez az alkalmazás megadhat NULL a SetClipboardData függvény hData paraméteréhez. Ez akkor hasznos, ha az alkalmazás számos vágólapformátumot támogat, amelyek némelyike vagy mindegyike időt vesz igénybe a rendereléshez. Ha egy NULL fogópontot ad át, az ablak csak akkor és ha szükséges, összetett vágólapformátumokat jelenít meg.

Ha egy ablak késlelteti a vágólap formátumának megjelenítését, fel kell készülnie arra, hogy igény szerint megjelenítse a formátumot mindaddig, amíg a vágólap tulajdonosa. A rendszer WM_RENDERFORMAT üzenetet küld a vágólap tulajdonosának, amikor egy nem renderelt formátumra vonatkozó kérés érkezik. Az üzenet fogadása után az ablaknak meg kell hívnia a SetClipboardData függvényt, hogy egy globális memórialeírót helyezzen el a vágólapon a kért formátumban.

Az alkalmazás nem nyithatja meg a vágólapot, mielőtt meghívja SetClipboardData a WM_RENDERFORMAT üzenetre válaszul. A vágólap megnyitása nem szükséges, és ennek bármilyen kísérlete meghiúsul, mert a vágólapot jelenleg az az alkalmazás tartja nyitva, amely a formátum megjelenítését kérte.

Ha a vágólap tulajdonosa hamarosan megsemmisül, és késlelteti a vágólap egyes vagy összes formátumának megjelenítését, megkapja a WM_RENDERALLFORMATS üzenetet. Az üzenet fogadása után az ablaknak meg kell nyitnia a vágólapot, ellenőrizze, hogy továbbra is a vágólap tulajdonosa-e a GetClipboardOwner függvénnyel, majd helyezzen érvényes memóriafogópontokat a vágólapra az általa biztosított összes vágólapformátumhoz. Ez biztosítja, hogy ezek a formátumok a vágólap tulajdonosának megsemmisítése után is elérhetők maradjanak.

A WM_RENDERFORMATellentétben a WM_RENDERALLFORMATS válaszoló alkalmazásoknak meg kell nyitniuk a vágólapot, mielőtt meghívják SetClipboardData, hogy elhelyezhessenek minden globális memóriafogantyút a vágólapon.

Az WM_RENDERALLFORMATS üzenetre válaszul nem renderelt vágólapformátumok nem lesznek elérhetők más alkalmazások számára, és a vágólapfüggvények már nem sorolják fel azokat.

Késleltetett megjelenítési útmutató

A késleltetett renderelés egy teljesítményfunkció, amely lehetővé teszi, hogy az alkalmazások ne végezhessenek munkát a vágólap adatainak olyan formátumban való megjelenítéséhez, amely soha nem kérhető. A késleltetett renderelés használata azonban a következő kompromisszumokat foglalja magában, amelyeket figyelembe kell venni:

  • A késleltetett renderelés használata némi összetettséget ad az alkalmazásnak, ezért két renderelési ablaküzenetet kell kezelnie a fent leírtak szerint.
  • A késleltetett renderelés azt jelenti, hogy az alkalmazás elveszíti a felhasználói felület válaszkészen tartásának lehetőségét, ha az adatok renderelése elegendő időt vesz igénybe, hogy az a felhasználó számára látható legyen. Késleltetett renderelés esetén, ha az adatokra végül szükség van, az ablaknak renderelnie kell az adatokat a renderelő ablak üzenetének feldolgozása során, a fent leírtak szerint. Ennek eredményeképpen, ha az adatok nagyon időigényesek a rendereléshez, előfordulhat, hogy az alkalmazás láthatóan nem válaszol (le van függesztve) a renderelés során, mivel a renderelő ablaküzenet feldolgozása során nem lehet más ablaküzeneteket feldolgozni. A késleltetett renderelést nem használó alkalmazások ehelyett úgy dönthetnek, hogy adatokat renderelnek egy háttérszálon annak érdekében, hogy a felhasználói felületre adott válasz megmaradjon a renderelés során, esetleg előrehaladási vagy lemondási lehetőségeket biztosítson, amelyek késleltetett renderelés esetén nem érhetők el.
  • A késleltetett renderelés használata kis többletterhelést jelent, ha az adatokra végül szükség van. Ha késleltetett renderelést használ, az ablak először meghívja a SetClipboardData függvényt egy NULL leíróval, és ha az adatokra később van szükség, az ablaknak válaszolnia kell egy ablaküzenetre, és második alkalommal meg kell hívnia a SetClipboardData függvényt egy leíróval a renderelt adatokhoz a fent leírtak szerint. Ennek eredményeképpen, ha az adatokra végül szükség van, a késleltetett renderelés növeli az ablaküzenet feldolgozásának költségét, és meghívja a SetClipboardData függvényt második alkalommal. Ez a költség kicsi, de nem nulla. Ha egy alkalmazás csak egyetlen vágólapformátumot támogat, és ha az adatokat mindig végül kérik, a késleltetett renderelés csak hozzáadja ezt a kis többletterhelést (a költségek hardverenként változnak, a becslés 10 és 100 mikroszekundum között van). Ha azonban az adatok kicsik, a késleltetett renderelés többletterhelése meghaladhatja az adatok renderelésének költségeit, ami a teljesítmény javítása érdekében késleltetett renderelést használ. (A tesztelés során a már végleges formájában lévő adatok esetében a késleltetett renderelés használatának többletterhelése következetesen túllépte az adatok vágólapra másolásának költségeit, ha az adatok 100 KiB vagy annál kisebbek. Ez a tesztelés nem tartalmazza az adatok renderelésének költségét, csak a renderelés után történő másolást.)
  • A késleltetett renderelés nettó teljesítményelőny, ha több időt takarít meg, mint amennyi többletterhelést okoz. A késleltetett renderelés többletterhelésének meghatározásához a mérés a legjobb, de 10–100 mikroszekundum becslés. Az egyes vágólapformátumok késleltetett renderelésének használatával járó megtakarítás kiszámításához mérje meg az adatok ilyen formátumban való megjelenítésének költségeit, és határozza meg, hogy a rendszer milyen gyakran kéri le a formátumot (a fent leírt ablaküzenetek alapján). Szorozza meg az adatok megjelenítésének költségét azzal a százalékkal, amellyel az adatok végleges lekérése nem történik meg (mielőtt a vágólap kiürítése vagy tartalma megváltozik), hogy megállapítsa az egyes vágólapformátumok késleltetett renderelésének megtakarítását. A késleltetett renderelés nettó teljesítményelőny, ha a megtakarítás meghaladja a többletköltséget.
  • Konkrét útmutatóként az olyan alkalmazások esetében, amelyek csak egyetlen vágólapformátumot támogatnak, például a szöveget, ahol az adatok renderelése nem lényegesen költséges, érdemes lehet közvetlenül a vágólapra helyezni az adatokat, ha az adatok mérete 4 KiB vagy annál kisebb.

Memória és vágólap

A vágólapra helyezendő memóriaobjektumokat a GlobalAlloc függvénnyel kell lefoglalni a GMEM_MOVEABLE jelzővel.

Miután a vágólapra helyezett egy memóriaobjektumot, a rendszer átadja a memóriafogópont tulajdonjogát a rendszernek. Amikor a vágólap kiürítve van, és a memóriaobjektum a következő vágólapformátumok egyikével rendelkezik, a rendszer felszabadítja a memóriaobjektumot a megadott függvény meghívásával:

Függvény az objektum felszabadításához Vágólap formátuma
DeleteMetaFile
CF_DSPENHMETAFILE
CF_DSPMETAFILEPICT
CF_ENHMETAFILE
CF_METAFILEPICT
DeleteObject
CF_BITMAP
CF_DSPBITMAP
CF_PALETTE
GlobalFree
CF_DIB
CF_DIBV5
CF_DSPTEXT
CF_OEMTEXT
CF_TEXT
CF_UNICODETEXT
egyik sem
CF_OWNERDISPLAY
Ha a vágólapot kiüríti egy CF_OWNERDISPLAY objektumból, magának az alkalmazásnak szabaddá kell tennie a memóriaobjektumot.