首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Direct2D呈现目标清除为完全透明

如何将Direct2D呈现目标清除为完全透明
EN

Stack Overflow用户
提问于 2010-04-08 20:37:02
回答 3查看 11K关注 0票数 8

我试图在一个看不见的上画出半透明的矩形.然而,使用ID2D1HwndRenderTarget::Clear清除窗口只会使整个窗口变黑,所以当我在顶部绘制矩形时,它们看起来是半黑色的。

如果我不清楚(),不画,那么窗口是无形的,它应该是。这里的罪魁祸首是“清清楚楚”,但如果我不使用它,那幅画就会很糟糕。

下面是我在我的WindowProc中使用的代码:

代码语言:javascript
运行
复制
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();

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-16 22:29:24

在创建RenderTarget时,您必须告诉D2D,您希望以像素格式使用alpha (在预乘模式下):

代码语言:javascript
运行
复制
  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 );

在此之后,调用alpha值为零的Clear()运行得很好。

票数 1
EN

Stack Overflow用户

发布于 2010-10-28 02:10:22

透明度是个问题。唯一支持每像素透明度的窗口是WS_EX_LAYERED窗口.这些窗口是为诸如拖放图标之类的用途而设计的,这会导致其他每一种使用中的问题。

使用D2D和WS_EX_LAYERED窗口需要使用DXGI呈现目标。对于EndDraw,从呈现目标中获取一个DC,然后将其传递到分层窗口,并告诉分层窗口更新自己。(用HWNDRenderTarget试试--它可能会使设备驱动程序崩溃)。

我怀疑你的窗户是透明的,因为它根本就没有绘图。

另一个你可能会遇到的..。如果窗口足够透明,鼠标单击将通过它到达基础窗口。

票数 5
EN

Stack Overflow用户

发布于 2015-12-08 03:28:11

使用ID2D1DCRenderTarget而不是ID2D1HwndRendTarget,然后在绘图开始之前绑定窗口的设备上下文(DC)。

当然,您需要为窗口设置WS_EX_LAYERED,然后调用SetLayeredWindowAttributes设置透明颜色:

代码语言:javascript
运行
复制
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);

截图:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2603276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档