Ah, am inteles. Problema e ca atunci cand dai PrintWindow, practic iti face un print la rectangle-u in care e fereastra ta, si in rest pune negru. (Incearca sa dai alt-printscrn pe o fereastra si vei avea acelasi rezultat in clipboard).<br>
<br>O solutie simpla este sa apelezi PrintWindow(hDesktop,.. ) unde hDesktop este HWND-ul desktop-ului. Nu mai tin minte clar cum il obtii, dar cel mai probabil este parintele hwnd-ului curent, deci ai putea sa mergi din hwnd in hwnd in sus in arbore pana dai de desktop (sau e chiar primul). Oricum, msdn stie.<br>
<br>Asa vei obtine o imagine foarte mare. Daca iei rectangle-ul ferestrei curente, ii iei dimensiunile si pozitia, poti sa faci crop din bitmap-ul obtinut de la PrintWindow si voila, ai textura ta. Ar trebui sa includa si transparenta. Nu tin minte comenzile, dar sunt operatii destul de rutina pe btimap-uri.<br>
<br>Si ca un sfat, daca nu esti constrans de alte lucruri (parte dintr-un proiect mai mare, obligatie de a folosi cod non-managed, etc) incearca sa folosesti .NET si nu WinApi (orice proiect existent winapi poate include librariile .NET foarte simplu). Are o biblioteca foarte facil de utilizat, atat pt directX, cat si pentru GDI si editare bitmap-uri. Acolo ai putea sa faci printwindow cu directshow, si ar fi mult mult mai rapid. (nu ma astept la mai mult de 10fps daca vrei sa faci print la desktop la fiecare frame).<br>
<br>Numai bine,<br>Dani<br><br><div class="gmail_quote">2009/6/16 Alin Popescu <span dir="ltr"><<a href="mailto:alinpopescu@live.com">alinpopescu@live.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Salut<br>
<br>
Multumesc pentru raspunsul rapid.<br>
<br>
Ideea e ca orice fereastra de windows are transparenta. La XP ea e se poate observa la colturile ferestrelor, care sunt netede<br>
(rotunde). Eu incerc sa salvez si alpha channel din device context-ul unde se renderizeaza fereastra ca apoi,<br>
in Direct3D, sa apara la fel de netede.<br>
<br>
Pana acum nu am reusit sa salvez decat RGB + A constant. Prin urmare in colturi imi apare o zona neagra.<br>
Alpha-ul texturii e 255 constant. As putea sa fac un pixel shader si sa ma folosesc de alpha test<br>
ca sa scot colturile negre, dar apare o problema daca in ferestra exista pixeli negrii(de exemplu text).<div><div></div><div class="h5"><br>
<br>
<br>
On Tue, 16 Jun 2009 01:10:15 +0300, Daniel Flamaropol <<a href="mailto:raptorclw@gmail.com" target="_blank">raptorclw@gmail.com</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Salut.<br>
<br>
Ce vrei sa spui prin "nu reusesc sa salvez si alpha channel" ?. Din ce am<br>
inteles eu, vrei sa faci un print screen la o fereastra.<br>
Unde ar fi alpha channel acolo? De asemenea, ce intelegi prin "ferestre 3D<br>
cu transparenta"?<br>
<br>
Presupun ca vrei sa faci o fereastra de Direct3D care sa para transparenta,<br>
la fiecare frame facand un capture la ce se afla<br>
in spatele ei, si randand respectiva textura in Direct3D (pe un quad<br>
eventual). Asta e?<br>
<br>
Numai bine,<br>
Dani<br>
<br>
2009/6/16 Andrei Cibotaru <<a href="mailto:andreicibotaru@gmail.com" target="_blank">andreicibotaru@gmail.com</a>><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Pai nu poti sa ii dai tu din direct3d transparenta?<br>
<br>
2009/6/16 Alin Popescu <<a href="mailto:alinpopescu@live.com" target="_blank">alinpopescu@live.com</a>><br>
<br>
Salut!<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
Nu are legatura cu ce s-a facut pe la so, dar are legatura cu mult prea<br>
obscurul WinAPI.<br>
Incerc sa fac o captura de fereastra si sa salvez pixelii intr-o textura<br>
de Direct3D. In final ferestre 3D cu transparenta :)<br>
<br>
Problema mea e ca nu reusesc sa salvez si alpha channel din fereastra.<br>
Am incercat sa folosesc si GetDIBits, dar fara rezultate.<br>
<br>
Poate a mai incercat cineva de pe aici si i-a gasit solutie.<br>
L-as ruga sa o impartaseasca cu comunitatea de WinAPI devs.<br>
<br>
void CaptureWindow(HWND hWnd, LPDIRECT3DTEXTURE9 Tex)<br>
{<br>
HDC hdcWindow = GetWindowDC(hWnd);<br>
HDC hdcMemory = CreateCompatibleDC(hdcWindow);<br>
HBITMAP hBitmap = CreateCompatibleBitmap(hdcWindow, Width, Height);<br>
hOld = SelectObject(hdcMemory, hBitmap);<br>
bool bResult = PrintWindow(hWnd, hdcMemory, 0);<br>
<br>
D3DLOCKED_RECT rect;<br>
Tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD);<br>
GetBitmapBits(hBitmap, Width * Height * 4, rect.pBits);<br>
Tex->UnlockRect(0);}<br>
<br>
SelectObject(hdcMemory, hOld);<br>
DeleteObject(hBitmap);<br>
DeleteDC(hdcMemory);<br>
ReleaseDC(hWnd, hdcWindow);<br>
}<br>
<br>
Thanx in advance.<br>
_______________________________________________<br>
so mailing list<br>
<a href="mailto:so@cursuri.cs.pub.ro" target="_blank">so@cursuri.cs.pub.ro</a><br>
<a href="http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so" target="_blank">http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so</a><br>
<br>
</blockquote>
<br>
<br>
<br>
--<br>
Cibo<br>
<br>
_______________________________________________<br>
so mailing list<br>
<a href="mailto:so@cursuri.cs.pub.ro" target="_blank">so@cursuri.cs.pub.ro</a><br>
<a href="http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so" target="_blank">http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so</a><br>
<br>
<br>
</blockquote></blockquote>
<br>
<br></div></div>
--<div><div></div><div class="h5"><br>
_______________________________________________<br>
so mailing list<br>
<a href="mailto:so@cursuri.cs.pub.ro" target="_blank">so@cursuri.cs.pub.ro</a><br>
<a href="http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so" target="_blank">http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so</a><br>
</div></div></blockquote></div><br>