2013-03-06 5 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_POPUP 또는 WS_OVERLAPPED 불투명도 문제는 해결되지만 하위 창은 부모와 관련없는 바탕 화면에 있습니다.

계층화 된 창? 계층화 된 Windows에서 작업하기로 결정했으나 VistaSP2 이상에서 대상을 지정하기 때문에 더 나은 솔루션이 될 수 있습니다. 나는 해결책을 시도했다 here 그러나 나는 너무 그것을 실행하지 못했다.

답변

1

픽셀 당 32 비트 창을 만들겠습니까? (댓글을 작성할 수 없으므로 여기에 충분한 담당자가 없습니다.)

이 경우 장면을 그릴 때마다 UpdateLayeredWindow (및 초기화하는 동안 CreateDIBSection 호출)를 사용해야합니다. , 당신은 같은 장면을 그리기 완료 후 :

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. 

자원의 해방 소개 :

초기화에 대해

// 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); 

// 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; 

EDIT : MemDC, OldBmp 및 DIBSectionBitmap은 창 단위입니다. MemDC는 HDC입니다. OldBmp는 HBITMAP입니다. DIBSectionBitmap은 HBITMAP입니다. 이 시점에서 자식 윈도우를 마치 자신의 주 윈도우에 포함 된 것처럼 픽셀 단위의 알파 정밀도로 그릴 수 있지만 집중과 메시지를 직접 처리해야합니다.