[so] [WinAPI]Capture Window with Alpha Channel

Alin Popescu alinpopescu at live.com
Tue Jun 16 01:18:20 EEST 2009


Salut

Multumesc pentru raspunsul rapid.

Ideea e ca orice fereastra de windows are transparenta. La XP ea e se  
poate observa la colturile ferestrelor, care sunt netede
(rotunde). Eu incerc sa salvez si alpha channel din device context-ul unde  
se renderizeaza fereastra ca apoi,
in Direct3D, sa apara la fel de netede.

Pana acum nu am reusit sa salvez decat RGB + A constant. Prin urmare in  
colturi imi apare o zona neagra.
Alpha-ul texturii e 255 constant. As putea sa fac un pixel shader si sa ma  
folosesc de alpha test
ca sa scot colturile negre, dar apare o problema daca in ferestra exista  
pixeli negrii(de exemplu text).


On Tue, 16 Jun 2009 01:10:15 +0300, Daniel Flamaropol  
<raptorclw at gmail.com> wrote:

> Salut.
>
> Ce vrei sa spui prin "nu reusesc sa salvez si alpha channel" ?. Din ce am
> inteles eu, vrei sa faci un print screen la o fereastra.
> Unde ar fi alpha channel acolo? De asemenea, ce intelegi prin "ferestre  
> 3D
> cu transparenta"?
>
> Presupun ca vrei sa faci o fereastra de Direct3D care sa para  
> transparenta,
> la fiecare frame facand un capture la ce se afla
> in spatele ei, si randand respectiva textura in Direct3D (pe un quad
> eventual). Asta e?
>
> Numai bine,
> Dani
>
> 2009/6/16 Andrei Cibotaru <andreicibotaru at gmail.com>
>
>> Pai nu poti sa ii dai tu din direct3d transparenta?
>>
>> 2009/6/16 Alin Popescu <alinpopescu at live.com>
>>
>> Salut!
>>>
>>> Nu are legatura cu ce s-a facut pe la so, dar are legatura cu mult prea
>>> obscurul WinAPI.
>>> Incerc sa fac o captura de fereastra si sa salvez pixelii intr-o  
>>> textura
>>> de Direct3D. In final ferestre 3D cu transparenta :)
>>>
>>> Problema mea e ca nu reusesc sa salvez si alpha channel din fereastra.
>>> Am incercat sa folosesc si GetDIBits, dar fara rezultate.
>>>
>>> Poate a mai incercat cineva de pe aici si i-a gasit solutie.
>>> L-as ruga sa o impartaseasca cu comunitatea de WinAPI devs.
>>>
>>> void CaptureWindow(HWND hWnd, LPDIRECT3DTEXTURE9 Tex)
>>> {
>>>   HDC hdcWindow = GetWindowDC(hWnd);
>>>   HDC hdcMemory = CreateCompatibleDC(hdcWindow);
>>>   HBITMAP hBitmap = CreateCompatibleBitmap(hdcWindow, Width, Height);
>>>   hOld = SelectObject(hdcMemory, hBitmap);
>>>   bool bResult = PrintWindow(hWnd, hdcMemory, 0);
>>>
>>>   D3DLOCKED_RECT rect;
>>>   Tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD);
>>>   GetBitmapBits(hBitmap, Width * Height * 4, rect.pBits);
>>>   Tex->UnlockRect(0);}
>>>
>>>   SelectObject(hdcMemory, hOld);
>>>   DeleteObject(hBitmap);
>>>   DeleteDC(hdcMemory);
>>>   ReleaseDC(hWnd, hdcWindow);
>>> }
>>>
>>> Thanx in advance.
>>> _______________________________________________
>>> so mailing list
>>> so at cursuri.cs.pub.ro
>>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>>>
>>
>>
>>
>> --
>> Cibo
>>
>> _______________________________________________
>> so mailing list
>> so at cursuri.cs.pub.ro
>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>>
>>


--


More information about the so mailing list