Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ID2D1HwndRenderTarget always having black background instead of transparent

I am trying to create a simple transparent window where I can draw with Direct2D.

So far what I have done:

  1. Created window
  2. Set style to WS_EX_LAYERED
  3. Set alpha color key as #FFF
  4. Draw using Windows Graphics a white rectangle
  5. Now window is transparent with per-pixel alpha
  6. Then make a target out of the window and draw using Direct2D
    • Make ALPHA _PREMULIPLIED target
    • Clear with #FFF with 0.0f alpha
  7. Window is now black

I just don't know how to make window to transparent. If you can point out my mistake, I would be obliged

like image 256
Mathew Kurian Avatar asked Sep 16 '13 20:09

Mathew Kurian


2 Answers

Here how it's achievable using DirectComposition API

Russian: http://www.oszone.net/25395/

English: https://msdn.microsoft.com/magazine/dn745861.aspx

Basically what author does is

  1. Sets WS_EX_NOREDIRECTIONBITMAP extended style to remove redirection bitmap of DWM. Content of window is now empty.

  2. Creates DirectComposition device

  3. Creates Composition SwapChain (and not hwnd swapchain)

  4. Places one visual with SwapChain as content as root visual.

  5. Renders into SwapChain using Direct2D API.

It also works well with WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST for creating event-transparent overlays.

like image 164
Oleh Nechytailo Avatar answered Oct 10 '22 02:10

Oleh Nechytailo


I don't think it's possible with directX. However GDI does work.

Take a look at the source here to see how it's done: http://pastebin.com/NJf8wi2V

In the source you can see that there is an option to attempt to use directx/opengl. However as you can see from running they do not work.

like image 45
user1052842 Avatar answered Oct 10 '22 02:10

user1052842