2010-04-08 2 views
7

보이지 않는 HWND에 반투명 사각형을 그려야합니다. 그러나 ID2D1HwndRenderTarget :: Clear로 창을 지우는 것은 전체 창을 검은 색으로 만들므로 맨 위에 직사각형을 그릴 때 반 검정으로 보입니다.Direct2D 렌더링 대상을 완전히 투명하게 지우는 방법

Clear()를 사용하지 않고 그리지 않으면 창이 보이지 않습니다. Clear()는 여기에서 범인이다; 그러나 내가 그것을 사용하지 않으면 회화가 심하게 엉망이된다.

여기 내 WindowProc에서 사용하고 코드는 다음과 같습니다 사전에

case WM_PAINT: 
    // Begin drawing 
    pRenderTarget->BeginDraw(); 
    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); 

    // Clear the window 
    pRenderTarget->Clear(); 

    // Paint the panel and its children 
    D2DSurface()->StartPainting(); 
    { 
     D2DSurface()->PaintTraverse(panel); 
    } 
    D2DSurface()->FinishPainting(); 

    // Finish drawing 
    HRESULT hr = plat->pRenderTarget->EndDraw(); 

감사합니다!

+0

참고 : 나는 0.0 등으로 삭제 시도 불투명도, 정확히 같은 결과. – Saul

+0

투명한 효과 그림을 붙여 넣을 수 있습니까? 나는 그것이 어떻게 작동하는지 알고 싶다. – zdd

답변

2

당신의 렌더 타겟을 만들 때, 당신은 당신이 픽셀 형식 (미리 곱셈 모드) 알파를 사용하려면 D2D 이야기해야합니다 : 제로의 알파 값 Clear()를 호출,이 후

HRESULT hr = mD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED)), 
    D2D1::HwndRenderTargetProperties(mWindow, size), 
    &mRenderTarget); 

을 잘 작동합니다.

+0

이것이 틀림 없습니까? 그러면 D2D1_ALPHA_MODE_PREMULTIPLIED 플래그가 알파 컴포넌트를 각 색상에 곱하기 때문에 렌더링 타겟의 배경을 검은 색으로 지울 것입니다. 따라서 알파 알파를 사용하면 (0, 0, 0, 0)이되는 r * 0, g * 0, b * 0을 의미하며, 검정색입니다. – zdd

+0

네,이 기능은 완벽하게 작동합니다. 배경색이 검정색이 아니고 투명합니다. – Noora

+1

그것은 나를 위해 작동하지 않습니다. 검정색 배경이 나타났습니다. 코드를 Clear 메서드에 붙여 넣을 수 있습니까? 아니면 스크린 샷을 붙여 넣을 수 있습니까? 투명한 창문? – zdd

2

투명도가 문제입니다. 픽셀 당 투명도를 지원하는 유일한 창은 WS_EX_LAYERED 창입니다. 이 창은 끌어서 놓기 아이콘과 같은 용도로 디자인되었으며 다른 모든 용도에서 문제를 일으 킵니다.

WS_EX_LAYERED 창에서 D2D를 사용하려면 DXGI 렌더링 대상을 사용해야합니다. EndDraw하려면 렌더링 대상에서 DC를 가져온 다음 계층화 된 창으로 DC를 전달하고 계층화 된 창에 자체를 업데이트하도록 알립니다. (이것을 HWNDRenderTarget과 함께 시도하십시오 - 아마도 장치 드라이버를 손상시킬 것입니다).

전혀 그림이 아니기 때문에 창문이 투명하게 보입니다.

다른 문제가 생길 수 있습니다 ... 창이 충분히 투명하면 마우스 클릭이 기본 창으로 이동합니다.

+1

사실이 아닙니다. 첫째로, WS_EX_LAYERED는 잘 동작하지만, 손으로 쓰는 코드가 많지 않은 것을 제외하고 모든 종류의 엉뚱한 윈도우가이 윈도우를 사용하여 만들어졌다. WS_EX_LAYERED는 픽셀 별 투명도를 더 이상 만들 수있는 유일한 방법이 아닙니다. Windows Vista 이상에서는 WS_EX_COMPOSITED가 있습니다. WS_EX_COMPOSITED는 Aero의 Direct3D 화면으로 바로 렌더링되므로 성능이 훨씬 뛰어납니다. 마우스 클릭에 관해서는, 그들은 오직 0 알파 픽셀을 통해서만 갈 것입니다. – Noora

+2

즉, WS_EX_COMPOSITED와'DwmExtendFrameIntoClientArea (mWindow, &m);)를 -1의 여백을 사용하여 결합하면 D3D 표면에 바로 그려지는 명확한 창이 나타납니다. 직접 클릭 테스트를해야합니다. 이것은 계층화 된 윈도우와 달리 이것을 사용합니다 – Noora

-1

D2D1 :: RenderTarget :: Clear()는 D2D1 :: ColorF() 통과가 매개 변수로 윈도우를 지우는 색상으로 요구합니다.

1

ID2D1HwndRendTarget 대신 ID2D1DCRendTarget을 사용하고 그리기를 시작하기 전에 창의 장치 컨텍스트 (DC)를 바인딩하십시오.

은 물론, 당신은 투명 색상을 설정하는 SetLayeredWindowAttributes를 호출 한 다음 창에 대한 WS_EX_LAYERED을 설정해야합니다

SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY); 

스크린 샷 :