|
|
Oldal: 1 / 1
|
[ 5 hozzászólás ] |
|
Szerző |
Üzenet |
foxi_63
vas-tag
Csatlakozott: hétf. máj. 07, 2007 21:33 Hozzászólások: 2
|
Sziasztok!
Azért más jellegű Ddraw-hoz tartozó kérdéseket is feltehettek, hátha válaszol valaki!
|
kedd máj. 08, 2007 20:22 |
|
|
foxi_63
vas-tag
Csatlakozott: hétf. máj. 07, 2007 21:33 Hozzászólások: 2
|
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.
|
hétf. máj. 07, 2007 21:53 |
|
|
mapboy2
ezüst tag
Csatlakozott: vas. okt. 22, 2006 10:18 Hozzászólások: 13
|
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.
|
csüt. nov. 16, 2006 11:25 |
|
|
Dester
Moderátor
Csatlakozott: kedd nov. 02, 2004 17:38 Hozzászólások: 5120 Tartózkodási hely: Budapest/Szeged
|
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.
|
csüt. nov. 16, 2006 8:52 |
|
|
mapboy2
ezüst tag
Csatlakozott: vas. okt. 22, 2006 10:18 Hozzászólások: 13
|
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?
|
szer. nov. 15, 2006 19:23 |
|
|
|
Oldal: 1 / 1
|
[ 5 hozzászólás ] |
|
Ki van itt |
Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 17 vendég |
|
Nem nyithatsz témákat ebben a fórumban. Nem válaszolhatsz egy témára ebben a fórumban. Nem szerkesztheted a hozzászólásaidat ebben a fórumban. Nem törölheted a hozzászólásaidat ebben a fórumban.
|
|
|