Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Jegyzet
Windows 10-es alkalmazások esetén a DirectComposition helyett a Windows.UI.Composition API-kat javasoljuk. További információ: Asztali alkalmazás modernizálása a Visual layerhasználatával.
Ez a témakör áttekintést nyújt a Microsoft DirectComposition alapfogalmairól. A következő szakaszokat tartalmazza:
- Összetétel
- vizualizációk
- eszközobjektum
- Kompozíció célablaka
- Tranzakciós összetétel
- Kapcsolódó témakörök
Kompozíció
A DirectComposition kompozíciós olyan bitképek gyűjteményeként definiálja, amelyeket különböző átalakítások, effektusok és animációk alkalmazásával kombinálunk és módosítunk, hogy vizuális eredményt hozzunk létre egy alkalmazás felhasználói felületén. A DirectComposition csak bitképtartalommal működik; nem támogatja a vektorokat és a szöveget. A DirectComposition nem biztosít bitképtartalmat. Ehelyett olyan felületeket biztosít, amelyeken a felhasználók D2D-vel, DXGI-vel rajzolhatnak, vagy feltölthetik saját anyagmintás tartalmaikat.
A DirectComposition-alkalmazások két objektumkészletet hoznak létre egy jelenet megírásához: az összeálló bitképeket, valamint a bitképek közötti térbeli kapcsolatokat meghatározó vizualizációkat. A DirectComposition által támogatott bitképobjektumokról további információt Bitkép objektumokcímű témakörben talál.
Látvány
Vizuális elemek (vagy vizuális objektumok) a DirectComposition alapvető elemei. Ezek az alapvető építőelemek, amelyekkel kompozíciókat és animációkat hozhat létre az alkalmazás felhasználói felületén.
Programozási értelemben a vizualizációk olyan objektumok, amelyek tulajdonságokkal rendelkeznek, és a tulajdonságok értékének beállításához használt felületet fednek le. A vizualizáció Tartalom tulajdonsága egy adott bitképet társít a vizualizációhoz, míg más tulajdonságok szabályozzák, hogy a DirectComposition hogyan helyezi el és módosítja a vizualizációt a képernyőn való megjelenítéskor.
További információ: Vizualizációstulajdonságai.
Vizuális fa
A DirectComposition egy vizualizációfanevű vizuális objektumok hierarchikus gyűjteményéből hoz létre kompozíciót. A fa gyökerében lévő vizualizációt gyökérvizualizációnak nevezzük, és egy vagy több gyermekvizualizációt társíthat hozzá. A gyermekvizualizációk egy vagy több saját gyermekvizualizációval rendelkezhetnek. Azok a vizualizációk, amelyek gyermekvizualizációkkal rendelkeznek, úgy hívjuk szülővizualizációk, és az azonos szülővel rendelkező gyermekvizualizációkat nevezzük testvérvizualizációknak. Egy adott vizualizációt az összes gyermek- és csökkenő vizualizációval együtt vizualizációs részhalmaznak nevezünk.
A vizualizáció helye a fában segít meghatározni a képernyő pozícióját és z-sorrendjét a kompozíció többi vizualizációja alapján. A gyökérvizualizáció a célablak ügyfélterületének bal felső sarkához viszonyítva helyezkedik el, ahol a kompozíció megjelenik. Minden gyermekvizualizáció a szülővizualizáció bal felső sarkához (vagy a TransformParent tulajdonság által megadott vizualizációhoz) képest van elhelyezve, és mindig a szülő előtt jelenik meg a z-sorrendben.
Az alábbi ábra a vizualizációk összetételét és a kompozíció létrehozásához használt vizualizációfa szerkezetét mutatja be. Az 1. vizualizáció a fő vizualizáció, és egyben a 2. és a 3. gyermekvizualizáció szülője is, amely testvérvizualizációk. A 3. vizualizáció két saját gyermekvizualizációval rendelkezik, a 4. és az 5. vizualizációval. A 3–5. vizualizációk együttesen alkotnak egy vizualizáció-részhalmazt.
A szülővizualizációk a gyermekvizualizációk rendezett listáját őrzik meg. Ha a testvérvizualizációk úgy vannak elhelyezve, hogy átfedésben vannak egymással, a DirectComposition a testvérek z-sorrendjét állítja be a szülővizualizáció gyermeklistájában való megjelenésük sorrendjének megfelelően. A listában később megjelenő testvérek a listában korábban megjelenő összes testvér elé kerülnek. Az alábbi ábrán az átfedésben lévő gyermekvizualizációk z-sorrendje látható.
Vizuális objektum tulajdonságai
A vizuális objektumok olyan tulajdonságokat tesznek elérhetővé, amelyek lehetővé teszik a vizuális bitkép-tartalom beállítását, valamint szabályozzák, hogyan helyezi el és manipulálja a vizuális tartalmat a DirectComposition. Az alábbi szakaszok részletesen ismertetik az egyes tulajdonságokat.
- Content tulajdonság
- Clip tulajdonság
- BorderMode tulajdonság
- BitmapInterpolationMode tulajdonság
- CompositeMode tulajdonság
- OffsetX és OffsetY tulajdonságok
- Effekt tulajdonság
- Tulajdonság átalakítása
- TransformParent tulajdonság
Tartalomtulajdonság
A vizualizáció Tartalom tulajdonsága a vizualizációhoz társított bitképtartalmat határozza meg. Ez az a bitkép, amelyet a DirectComposition használ, amikor a vizualizációt belefoglalja egy összeállításba.
A vizualizáció Tartalom tulajdonságát az IDCompositionVisual::SetContent metódus meghívásával állíthatja be.
A DirectComposition által támogatott bitképtartalmak típusairól további információt bitképobjektumokcímű témakörben talál.
Clip tulajdonság
A vizuális elem Clip tulajdonsága a kivágási régió (vagy kivágási téglalap) nevű téglalapot határozza meg. Vizualizáció megjelenítésekor csak a vágórégióba eső vizualizációrész jelenik meg, míg a kivágási régión kívülre eső tartalom ki lesz vágva (azaz nem jelenik meg). A DirectComposition támogatja a lekerekített vagy négyzetes sarkokkal rendelkező kivágási régiókat.
A vizualizáció Clip tulajdonságát az IDCompositionVisual::SetClip metódus meghívásával állíthatja be.
További információ: Kivágási.
BorderMode tulajdonság
A BorderMode tulajdonság azt határozza meg, hogyan kell megírni a vizualizációhoz társított bitképek és klipek széleit, illetve a vizualizációban gyökerező részterület vizualizációit.
A szegély mód hatással van arra, hogy a bitkép szélei hogyan legyenek összeállítva a bitkép átalakításakor, hogy a szélek ne legyenek tengelyre igazítva egész számok koordinátáival. Befolyásolja azt is, hogyan van kivágva a tartalom a lekerekített sarkokkal rendelkező klip sarkainál, valamint egy átalakított klip szélénél, ha a szélek nincsenek tengelyre igazítva egész szám koordinátákkal.
További információ: IDCompositionVisual::SetBorderMode.
BitmapInterpolationMode tulajdonság
A BitmapInterpolationMode tulajdonság azt mondja meg a DirectCompositionnak, hogyan kell a bitmapet összeállítani az átalakítás során úgy, hogy a bitmap képpontjai és a képernyő képpontjai között ne legyen egy-az-egyhez megfeleltetés.
Egy vizualizáció BitmapInterpolationMode tulajdonságát a IDCompositionVisual::SetBitmapInterpolationMode metódus meghívásával állíthatja be.
CompositeMode tulajdonság
A CompositeMode tulajdonság azt jelzi a DirectComposition-nak, hogyan keverje a vizualizáció bitkép tartalmát a renderelési célhoz. A támogatott összetett módok leírását a DCOMPOSITION_COMPOSITE_MODEcímű témakörben talál.
A vizualizáció CompositeMode tulajdonságát az IDCompositionVisual::SetCompositeMode metódus meghívásával állíthatja be.
OffsetX és OffsetY tulajdonságok
Az OffsetX és az OffsetY tulajdonság azt mondja meg a DirectComposition-nak, hogy hol helyezzen el egy vizualizációt vízszintesen és függőlegesen. Meghatározzák azt a kétdimenziós rögzített pozíciót, amelyből a vizualizáció összes átalakítása és effektusa ki lesz számítva.
Gyökérvizualizációk esetében az OffsetX és az OffsetY tulajdonságok határozzák meg a vizualizációt üzemeltető ablak bal felső sarkához képest egy pont x koordinátáját és y koordinátáját. Gyermekvizualizáció esetén a koordináták a szülő bal felső sarkához, vagy ha a TransformParent tulajdonság van megadva, a megadott vizualizáció bal felső sarkához vannak viszonyítva. Vizualizáció megjelenítésekor úgy van elhelyezve, hogy a vizualizáció bal felső sarka egybeessen a megadott koordinátákkal.
Egy vizualizáció OffsetX és OffsetY tulajdonságát az IDCompositionVisual::SetOffsetX és SetOffsetY metódus meghívásával állíthatja be.
Effect tulajdonság
Az Effektus tulajdonság lehetővé teszi egy olyan effektus vagy effektuscsoport megadását, amely módosítja a vizualizáció és annak alterületének összeállítását. Megadhat például olyan effektusokat, amelyek szabályozzák a vizualizáció átlátszatlanságát, különböző módokon keverik a vizualizációt egy másik bittérképpel, és perspektíva-átalakításokat alkalmazhatnak a vizualizációra.
A vizualizáció Effektus tulajdonságát az IDCompositionVisual::SetEffect metódus meghívásával állíthatja be.
További információ: Effektusok.
Tulajdonság átalakítása
Az Átalakítás tulajdonság kétdimenziós (2D) átalakítást vagy 2D-átalakítások csoportját adja meg a DirectComposition vizualizáción való végrehajtásához. Az átalakítás (vagy transzformáció) olyan művelet, amely módosítja egy vizuális elem koordinátarendszerét a szülőhöz képest, vagy a TransformParent tulajdonság által meghatározott vizuális elemhez képest. Az átalakításokkal módosíthatja a vizuális elemek pozícióját, méretét vagy természetét úgy, hogy áthelyezi másik helyre (transzformáció), nagyobbá vagy kisebbé teszi (skálázás), forgatja (elforgatás), eltorzítja az alakját (döntés), és így tovább.
Egy vizualizáció Átalakítás tulajdonságát az IDCompositionVisual::SetTransform metódus meghívásával állíthatja be.
További információkért lásd: Átalakítások.
TransformParent tulajdonság
A vizualizáció koordinátarendszerét az OffsetX, az OffsetY és az Transform tulajdonság módosítja. Általában ezek a tulajdonságok határozzák meg egy vizualizáció koordináta-rendszerét a közvetlen szülőhöz képest. Ha a szülőtől eltérő vizualizációt szeretne használni egy gyermekvizualizáció koordináta-rendszerének alapjaként, a TransformParent tulajdonság használatával adjon meg egy másik vizualizációt "szülőként" átalakítási célokra.
A vizualizáció TransformParent tulajdonságát az IDCompositionVisual::SetTransformParent metódus meghívásával állíthatja be.
Eszközobjektum
A DirectComposition használatához számos COM-objektumot kell létrehoznia és módosítania. Az első létrehozandó objektum a DirectComposition eszközobjektum, mert az a kompozícióban használt összes többi objektum létrehozására szolgál.
Eszközobjektumot a DCompositionCreateDevice függvény meghívásával hozhat létre, amely egy IDCompositionDevice interfészmutatót ad vissza. Ez a felület számos metódust tesz elérhetővé, amelyekkel vizuális objektumokat, clip objektumokat, animációs objektumokat, objektumokat alakíthat át, objektumokat effektusokat hozhat létre stb.
Az eszközobjektum egy másik célt is szolgál amellett, hogy gyárként szolgál más objektumok létrehozásához. Egy Commit nevű metódust tesz elérhetővé, amely egy vizuális fát továbbít a DirectComposition-nak feldolgozásra. További információ: Tranzakcióösszetétel.
Ne feledje, hogy bár az eszközobjektum több példányát is létrehozhatja az alkalmazásban, az adott összetételben használt összes objektumot ugyanannak az eszközobjektumnak kell létrehoznia – egyetlen kivétellel: Ugyanazon a vizualizációfán egyesítheti a különböző eszközobjektumokból származó vizuális objektumokat. Ha így tesz, a DirectComposition a szokásos módon kezeli a vizualizációs fát, azzal a kivételrel, hogy a fa egy adott vizualizációs objektumának módosítása csak akkor lép érvénybe, ha a vizualizáció objektumot létrehozó eszközobjektumon meghívja a Véglegesítés metódust.
Az ugyanazon a vizualizációfán lévő különböző eszközök vizualizációinak használata lehetővé teszi, hogy több szál hozzon létre és módosítson egy vizualizációs fát, miközben két független eszközt tart fenn, amelyek aszinkron módon véglegesíthetik a módosításokat. További információ: eszközközi vizualizációs fák.
Kompozíció célzott ablaka
A vizualizációs fát egy ablakhoz kell kötni, mielőtt a fa bármelyik vizualizációja megjeleníthető lenne a képernyőn. Az kompozíció célablakánaknevű ablak lehet felső szintű ablak vagy gyermekablak. A kompozíció célablaka lehet rétegzett ablak is; vagyis WS_EX_LAYERED ablakstílusa is lehet.
A DirectComposition lehetővé teszi, hogy egy alkalmazás legfeljebb két vizualizációs fát kössön az egyes ablakokhoz. A vizuális fák közé tartozik egy, amelyet közvetlenül az ablak tetejére komponáltak, de az összes gyermekablak mögé, valamint egy másik, amely az ablak és a gyermekablakok fölé is kerül. Más szóval minden ablak négy fogalmi rétegből áll, és az összes réteg ki van vágva a célablak látható területére. Az alábbi ábrán egy ablak négy fogalmi rétege látható.
Tranzakciós összetétel
A DirectComposition egy tranzakciós modellt használ, melyben egy vizuális elemen eszközölt módosítások kötegelt készletét hozza létre, majd jóváhagyja a készletet a DirectComposition számára, az egyik lépésben történő feldolgozás érdekében. Módosíthatja ugyanazt a DirectComposition-vizualizációs objektumot, és tetszőleges számú alkalommal véglegesítheti a módosításokat. Amikor az Asztali ablakkezelő (DWM) felveszi a kötegeket, felveszi az összes függőben lévő köteget, és a véglegesített sorrendben alkalmazza őket a következő keretre.
Az egyetlen véglegesítésen belüli összes módosítás garantáltan egyetlen keretre lesz alkalmazva. Mivel a DWM keretenként egyszer gyűjti össze a kötegeket, az egyes objektumokat keretenként csak egyszer módosíthatja. A különböző objektumokat módosító későbbi véglegesítések is alkalmazhatók az aktuális keretre, de a DirectComposition nem garantálja, hogy a módosítások ugyanabban a keretben fognak történni.
Az IDCompositionSurface::BeginDraw és IDCompositionSurface::EndDraw metódusokkal szinkronizálhatja a renderelési frissítéseket a vizuális frissítésekkel. Meghívhatja például IDCompositionSurface::BeginDraw, frissítheti egy vizualizáció OffsetX és Clip tulajdonságát, meghívhatja IDCompositionDevice::Commit, rajzoljon tartalmat a Microsoft DirectX-lel, majd hívja meg IDCompositionSurface::EndDraw. Ebben az esetben a Microsoft DirectComposition biztosítja, hogy a bitkép tartalma és a vizualizáció tulajdonságai egyszerre frissülnek.
Csoportosítás
Ugyanazon a vizualizáción belül több módosítást végezhet, vagy különböző vizualizációkon belül tehet több változtatást ugyanabban a keretben. Ha ugyanazon a kereten belül több módosítást végez ugyanazon vizualizáción, tartsa szem előtt az alábbi szempontokat:
Ha egy vizualizáció ugyanazon tulajdonságán több módosítást hajt végre, csak az utolsó módosítás lesz alkalmazva. Ha például az átlátszatlanságot 0-ra, majd 0,5-re, végül pedig 1,0-ra állítja, a vizualizációra csak az 1,0 opacitás lesz alkalmazva.
Ha ugyanazon vizualizáció több tulajdonságát is módosítja, a DirectComposition először a vizualizációra, majd a gyermekvizualizációkra alkalmazza a módosításokat. A tulajdonságokat a rendszer a következő sorrendben alkalmazza, függetlenül attól, hogy milyen sorrendben adja meg őket:
- Ellensúlyoz
- Átalakít
- Klip
- Hatás
Az alábbi ábra azt mutatja, hogy mind a négy tulajdonság alkalmazása történt a vizualizációban.
Ne feledje, hogy a rendszer az összes módosítást egyszerre alkalmazza a vizualizációra ugyanazon keret kontextusában. Ez azt jelenti, hogy a felhasználó szemszögéből a vizualizáció módosításai azonnal történnek.
Az Átalakítás tulajdonság esetében az IDCompositionDevice::CreateTransformGroup használatával létrehozhat egy olyan átalakításcsoportot, amely egyszerre alkalmazható egy vizualizációra. A DirectComposition a megadott sorrendben alkalmazza az átalakításokat.
Az Effektus tulajdonság esetében az IDCompositionEffectGroup használatával alkalmazhat effektuscsoportot. A DirectComposition a megadott sorrendben alkalmazza az effektusokat. Emellett a 3D perspektíva transzformációk a vizuális fa kisimítását eredményezik, miután az aktuális vizuális elem összes 3D transzformációját alkalmazták. Ez segít biztosítani, hogy az eredményként kapott vizualizáció a lehető legközelebb nézzen ki a 3D-hez.
Szinkronizálás
Az alkalmazás egyszerre több szálból is meghívhatja a DirectComposition-t. A végrehajtási sorrend a szekvenciális hívások esetében garantált, az egyidejű hívások esetében azonban nem. Ha például az A szál módosít egy vizualizációt, és a B szál egyszerre véglegesíti a köteget, nem határozza meg, hogy a vizualizáció módosítása szerepel-e a véglegesített kötegben, vagy új köteget indít el. Ha azonban az alkalmazás más szinkronizálási mechanizmusokat használ annak biztosítására, hogy az egyik metódus a másik előtt legyen meghívva, a DirectComposition tiszteletben tartja a hívási sorrendet, és úgy dolgozza fel őket, mintha mindkét hívás egyetlen szálból lett volna kiállítva ebben a sorrendben.
Eszközközi vizualizációs fák
A DirectComposition-objektumok nincsenek szálhoz kötve; több szál használatával is módosíthatja ugyanazt az objektumkészletet. Ugyanakkor vegye figyelembe az alábbi problémákat ugyanazon eszközobjektum megosztásakor.
- Mindkét szálnak képesnek kell lennie a IDCompositionDevice::Commitmeghívására. Ha csak az egyik szál hívja meg IDCompositionDevice::Commit, a másik szál nem tudja véglegesíteni a módosításait a DirectComposition-ban.
- A tranzakciós viselkedés elveszhet, ha az egyik szál meghívja IDCompositionDevice::Commit, míg a másik szál továbbra is olyan változtatásokat végez, amelyek ugyanannak a tranzakciónak a részét képezik.
Ha több egyidejű tranzakciót kell véglegesítenie a DirectComposition-ba, több eszközobjektumot kell használnia, esetleg több szálból. Ebben a forgatókönyvben ugyanazt a vizualizációs fát mindkét eszközobjektum megosztja, és minden eszközobjektum véglegesíti a saját tranzakcióit.
Az alábbi ábrán egy két eszközobjektum által megosztott vizualizációs fa látható. Az 1., 2., 4. és 5. képet az egyik vagy a másik eszköz birtokolja, de a 3. képet mindkét eszköz megosztja, és ezért két részfát össze tud kapcsolni egyetlen nagyobb vizuális fához. A vizualizációfa megosztása lehetővé teszi, hogy a két eszköz aszinkron módon manipulálható legyen két különböző szálból.
két eszköz által megosztott vizualizációs fa 
A vizualizációs fa két eszköz közötti megosztásának hasznosságát szemlélteti egy olyan architektúra, amely lehetővé teszi az alacsony késleltetésű érintéses bevitelt. Az architektúra két szálat használhat, az egyik a legtöbb felhasználói felületi feladatot kezeli, a másikat pedig az érintéses beviteli események feldolgozására. Az érintéses szál a felhasználói beviteli kézmozdulat alapján frissíti egy adott vizualizáció átalakítását. Az átalakítás frissítésével az érintési szál a vizuálelem alatti teljes részfát a felhasználó ujjának mozgását követve, fel- és le is skálázhatja, miközben a felhasználó többujjas érintési mozdulatot hajt végre, és így tovább. A felhasználói felületi szál megtartja a kompozíciós fa nagy részének tulajdonjogát, és az érintési szál csak azt a néhány vizualizációt birtokolja, amelyek az aszinkron érintéses válaszhoz vannak címkézve. Az alábbi ábrán egy ilyen kompozíciós fa egyszerűsített verziója látható:
A felhasználói felületi szál általában csak a kizárólagos tulajdonában lévő vizualizációkat módosítja, az érintési szál pedig csak a megosztott vizualizációt módosítja. Az egyetlen kivétel az érintéssel kompatibilis részhalmaz létrehozásakor vagy megsemmisítésekor fordul elő.
Kapcsolódó témakörök