c++ - Direct2D:透明父窗口上的不透明子窗口

标签 c++ transparency direct2d layered-windows

我想创建一个 Direct2D 应用程序,它有一个透明的背景,上面放置了一些不透明的复杂控件。 该问题可以分解成几个子问题:

架构:控件是否应该作为子窗口实现?我认为这是正确的方法,而不是创建实现子窗口功能的 Direct2D 多边形。

我试图通过初始化父窗口来实现这一点:

SetWindowLong(m_hwnd, GWL_EXSTYLE, GetWindowLong(m_hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(m_hwnd, 0, (255 * 50) / 100, LWA_ALPHA);

并将子窗口创建为WS_CHILD。这导致了一个 child ,其中包括背景在内的所有 D2D 绘图都是透明的。我找不到让 child 不透明的方法。 当我将子窗口创建为 WS_POPUPWS_OVERLAPPED 时,不透明度问题已解决,但子窗口位于与父窗口无关的桌面上。

分层窗口? 我选择使用分层 Windows,但由于我的目标是 VistaSP2 及更高版本,因此可能会有更好的解决方案。 我尝试了提供的解决方案 here但我也没有实现它。

最佳答案

你的意思是创建一个每像素 32 位的窗口吗? (很抱歉无法发表评论,这里的代表不够)

在这种情况下,无论如何,每次完成场景绘制后,您都必须使用 UpdateLayeredWindow(以及初始化时调用 CreateDIBSection),例如:

// Draw to your D2D1 RenderTarget here
RECT rcWin = {0};
GetWindowRect(hWnd,&rcWin);
POINT ptw = {rcWin.left,rcWin.top};
SIZE pts = {rcWin.right-rcWin.left,rcWin.bottom-rcWin.top};
POINT ptsrc = {0};
HDC ScreenDC = GetDC(0);
UpdateLayeredWindow( hWnd, ScreenDC, &ptw, &pts, MemDC, &ptsrc, 0, &bf, ULW_ALPHA);
ReleaseDC(0,ScreenDC);

关于初始化:

RECT r = {0};
GetWindowRect(hWnd,&r);
HDC scrDC = GetDC(0);
MemDC = CreateCompatibleDC(scrDC);
ReleaseDC(0,scrDC);
if(!MemDC)
    { FailInit(); }
BITMAPINFO bmi = {0};
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biWidth = r.right-r.left;
bmi.bmiHeader.biHeight = r.bottom-r.top;
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
DIBSectionBitmap = CreateDIBSection(MemDC,&bmi,DIB_RGB_COLORS,0,0,0);
if(!DIBSectionBitmap)
    return 0;
OldBmp = (HBITMAP)SelectObject(MemDC,DIBSectionBitmap);
// Now create the HWND D2D1 RenderTarget.

关于资源的释放:

// Free the D2D1 RenderTarget here
if(MemDC && OldBmp)
    SelectObject(MemDC,OldBmp);
if(DIBSectionBitmap)
    DeleteObject(DIBSectionBitmap);
if(MemDC)
    DeleteDC(MemDC);
MemDC = 0;
OldBmp = 0;
DIBSectionBitmap = 0;

编辑:MemDC、OldBmp 和 DIBSectionBitmap 是基于窗口的。 MemDC 是一个 HDC。 OldBmp 是一个 HBITMAP。 DIBSectionBitmap 是一个 HBITMAP。 此时,您可以绘制子窗口,就像它们是您自己的主窗口的一部分一样,具有每像素 alpha 精度,但您需要自己处理聚焦和消息传递。

关于c++ - Direct2D:透明父窗口上的不透明子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15249972/

相关文章:

c++ - 错误 LNK2005 : constructor already defined

c++ - 在每个操作系统上哪里可以找到受信任的根证书来满足 mbedtls?

vim - 在 (neo)vim 中禁用背景透明度

android如何在canvas半透明上绘制位图

matrix - 使用 Direct2D 将角点映射到任意位置

c++ - c++ (Direct2D) 中的混合模式

c++ - 从源代码编译与 deb 包编译

c++ - boost.multiindex 和值的地址作为键

swift - 将[UInt8]转换为白色透明图像

direct2d - sharpDX 中的 MeasureString