Direct2D:透明父窗口之上的不透明子窗口
Direct2D: Opaque child windows over a transparent parent window
我想创建一个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。这导致所有D2D绘图包括背景都是透明的。我找不到让孩子变得不透明的方法。当我将子窗口创建为WS_POPUP或WS_OVERLAPPED时,不透明度问题得到解决,但子窗口位于桌面,与父窗口无关。
分层窗口吗?我选择使用分层窗口,但由于我的目标是vista 2和更高版本,可能有更好的解决方案。我尝试了这里提供的解决方案,但我也未能实现它。
你的意思是创建一个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精度,但您需要自己处理聚焦和消息传递。
相关文章:
- SDL 窗口不会弹出
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- 枚举窗口不检测窗口
- 如何创建子窗口是透明的,父窗口是不透明的?
- 从静态库使用时隐藏不透明结构的内容
- 对于指向C++类的不透明C指针,正确的typedef是什么
- 使用 pybind11 混合类型转换和不透明类型
- 处理 pybind11 中的不透明指针
- 为什么我的窗口不显示?
- gtkmm 和多窗口不起作用
- Pybind11在不透明载体的不透明载体上访问
- 窗口不关闭GLFW
- Glut和Gnuplot窗口不同时出现
- SWIG共享_ptr会导致不透明的对象
- 具有 C 链接和C++实现的不透明结构
- Windows SetFocus,目标窗口不会捕获键盘输入
- 使透明窗口不点击
- 如何创建内容不透明的完全透明的窗口
- Direct2D:透明父窗口之上的不透明子窗口
- SDL OpenGL窗口不响应,透明