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.
:D :D :D

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/