2013-03-06 182 views
2

我想创建一个具有透明背景的Direct2D应用程序,其中放置了一些不透明的复杂控件。 该问题可以分解为几个子问题: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_POPUPWS_OVERLAPPED不透明度问题已解决,但子窗口位于与父项无关的桌面上。

分层窗口? 我选择与Layered Windows一起工作,但由于我瞄准VistaSP2及更高版本,可能会有更好的解决方案。 我试过解决方案here,但我也没有实现它。

回答

1

你的意思是创建一个每像素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精度,但您需要自行处理对焦和消息传递。