Terminál Fórum https://forum.technokrata.hu/forum/ |
|
DirectDraw https://forum.technokrata.hu/forum/viewtopic.php?f=2&t=32755 |
Oldal: 1 / 1 |
Szerző: | foxi_63 [ kedd máj. 08, 2007 20:22 ] |
Hozzászólás témája: | |
Sziasztok! Azért más jellegű Ddraw-hoz tartozó kérdéseket is feltehettek, hátha válaszol valaki! |
Szerző: | foxi_63 [ hétf. máj. 07, 2007 21:53 ] |
Hozzászólás témája: | |
Sziasztok! Bár rég senki sem írt a topicba,azért én is válaszolok,hátha segítek valakinek!. A DDraw átlátszóság megoldása a <Wingdi.h> ban és a hozzátartozó msimg32.lib -ben van leírva! Kell a forrásfelület HDC-je (cime) és a célfelület HDC-je ezeket egyszerű GetDC() függvénnyel megkapjuk. Azután szükség van egy BLENDFUNCTION tipusú struktúrára ennek kitöltése pl.: BLENDFUNCTION bl; bl.AlphaFormat= 0; bl.BlendFlags=0; bl.SourceConstantAlpha= 128;// 0és 255 közötti érték az átlátszóság mértéke bl.BlendOp=0; És meg kell hívni az AlphaBlend függvényt, dekralációja: BOOL AlphaBlend( HDC hdcDest, // handle to destination DC int nXOriginDest, // x-coord of upper-left corner int nYOriginDest, // y-coord of upper-left corner int nWidthDest, // destination width int nHeightDest, // destination height HDC hdcSrc, // handle to source DC int nXOriginSrc, // x-coord of upper-left corner int nYOriginSrc, // y-coord of upper-left corner int nWidthSrc, // source width int nHeightSrc, // source height BLENDFUNCTION blendFunction // alpha-blending function ); kiválóan lehet nagyítani, kicsinyíteni, és az átlátszóságot állítani. |
Szerző: | mapboy2 [ csüt. nov. 16, 2006 11:25 ] |
Hozzászólás témája: | |
Dester írta: Nem egyszerű a kérdésed. DirectDraw-t nem használtam, de kétlem, hogy a részleges átlátszóságot ne tudná. Egyébként Win2000/XP alatt már elérhető (Delphi alatt) az AlphaBlend tulajdonság, amivel egy formnak részleges átlátszóságot tudsz adni. Szóval szerintem itt nem DD lesz a megoldás. Másrészt - ugyan a C# ezen részét nem ismerem - úgy néz ki, hogy a KeyColor csak 1 bites átlátszóságot tud, tehát neked mindenképp valami Alpha tulajdonságot kéne keresned. Ez valószínűleg csak a hagyományostól eltérő alakú formok kialakításában játszik szerepet egy maszkkal kombinálva. Delphi alatt a fenti a megoldás, a többit nem ismerem. Mint említettem Delphi alatt is programozom, így amít említettél már használtam, Delphi 7 alatt jelent meg elöször ez az AlphaBlend tulajdonság, de szerintem a Delphi ehhez a GDI-t használja. Egyébként C# alatt nincs ilyen tulajdonsága a form-nak, de nekem nem is ez kell, egyszerűen rajzolni szeretnék a képernyőre (nem a form-ra), erre csak az overlay jó, ez nem is vitás, a DD-t azért használom mert igen gyors mivel közvetlenül elérem a videókártya memóriáját, illetve bemásolhatok oda más képeket is off-screen (a 256MB-on elfér ugye pár kép ) és innen pedig hardware-esen tudom "bevágni" a képernyőre, ráadásul még nagyítnai, kicsinyiteni is hardveressen lehet ha támogatja a kártya. Akár még a főképernyőre is irhatok közvetlenül, bár ezzel vigyázni kell, mert igy "ráfirkálok" az ott lévő ablakokra is, és erről a windows nem is fog tudni, igy nem frissiti, ha elmozgatom onnan. Ami a lényeg, hogyha beállítom az alpha csatornát, hogy használhassam, akkor kiakad a DD inicializáláskor, de nem tudom, hogy azért mert rosszul csinálom, vagy azért mert nem támogatja. Egy másik ötletem az volt, hogy ha már úgy is hozzáférek a képernyőhöz elöször kiolvasom az eredeti pixelt, majd szoftveressen megvalósítva az átlátszóságot "összekeverem" megfelelő arányban (az alpha csatorna szerint) az új pixelellel. Müködni müködik a dolog, de valamiért villódzik, pedig lockolom a surface-t irás elött, off-screen modosítom, vagyis kirakáshoz dupla buffert használok, és a szinkronra is figyelek mikor megcserélem őket. Valahol egyébként azt olvastam, hogy bár a DD Overlay Interface tartalmazza az alpha csatorna kezelést, végülis mégsem implmentálták ezt a DD-be... u.i.: Egyébként a keycolor nem 1 bites hanem 32 bites, egy RGB színt lehet itt megadni, ha ez a szín szerepel valahol a képben akkor az teljessen átlátszó lesz a képernyőre kirakva, a többi szín pedig megjelenik "rendessen". Pl. ha a 0,0,0-állítod be ami a fekete, akkor ez átlátszó lesz, és ahol tényleg feketét akarsz megjeleníteni ott pl. a 0,0,1 RGB kódot használhatod, amirő ember meg nem mondja hogy 1 árnyalattal világossab fekete. |
Szerző: | Dester [ csüt. nov. 16, 2006 8:52 ] |
Hozzászólás témája: | |
Nem egyszerű a kérdésed. DirectDraw-t nem használtam, de kétlem, hogy a részleges átlátszóságot ne tudná. Egyébként Win2000/XP alatt már elérhető (Delphi alatt) az AlphaBlend tulajdonság, amivel egy formnak részleges átlátszóságot tudsz adni. Szóval szerintem itt nem DD lesz a megoldás. Másrészt - ugyan a C# ezen részét nem ismerem - úgy néz ki, hogy a KeyColor csak 1 bites átlátszóságot tud, tehát neked mindenképp valami Alpha tulajdonságot kéne keresned. Ez valószínűleg csak a hagyományostól eltérő alakú formok kialakításában játszik szerepet egy maszkkal kombinálva. Delphi alatt a fenti a megoldás, a többit nem ismerem. |
Szerző: | mapboy2 [ szer. nov. 15, 2006 19:23 ] |
Hozzászólás témája: | DirectDraw |
A DirectDraw Overlay technikával "rajzolok" a képernyőre C# alatt, ez müködik is és nagyságrendekkel gyorsabb, mint a GDI+, egy gondom van, nem tudom használni az alpha csatornát, mindig kiakad a Surface inicializálásakor!! Van ugye a caps.KeyColor struktúra amivel megadhatom, hogy melyik az a szin ami átlátszó, a többi meg nem, ez müködik is, de vagy teljessen átlátszó vagy egyáltalán nem, ezzel nem tudok részleges átlátszóságot elérni. Tud valaki segíteni, programozott itt valaki DirecDraw-t? Jöhet C,C++,Delphi példa is, ezekben is programozom. Olvastam olyat is, hogy állítólag ez nincs is implementálva a DirectDraw-ba, igaz ez? Ha igen akkor hogy csinálják a "félig" átlátszó formokat? |
Oldal: 1 / 1 | Időzóna: UTC + 1 óra |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |