Drawing in layered window with Direct2D

从c方式创建窗体,创建默认消息处理:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        break;
    case WM_ERASEBKGND:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
} 

创建d2d资源:

    CoInitialize(NULL);
    ID2D1Factory* pD2DFactory = NULL;
    ID2D1DCRenderTarget* pRenderTarget = NULL;
    ID2D1SolidColorBrush* pWhiteBrush = NULL;
    D2D1_SIZE_U size = SizeU(_nScrWidth, _nScrHeight);

    HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);
    if (hr < 0) { goto EXIT_ENTRY; }

    hr = pD2DFactory->CreateDCRenderTarget(
        &RenderTargetProperties(
            D2D1_RENDER_TARGET_TYPE_DEFAULT, 
            PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)),
        &pRenderTarget);

    if (hr < 0) { goto EXIT_ENTRY; } 

    hr = pRenderTarget->CreateSolidColorBrush(ColorF(0xffffffff, 1.0), &pWhiteBrush);

    if (hr < 0) { goto EXIT_ENTRY; }

整个程序只创建一次内存dc,然后每次更新都清空这个DC就行,不需要反复创建删除,这样可以高效地使用d2d,不再需要gdi绘制函数了

    while (GetAsyncKeyState(VK_ESCAPE) >= 0)
    {
        pRenderTarget->BeginDraw();
        pRenderTarget->Clear(0);
        
        UpdateSnow_D2D(pRenderTarget, pWhiteBrush, snowSmall, SnowSize1Pixel);
        UpdateSnow_D2D(pRenderTarget, pWhiteBrush, snowBig, SnowSize4Pixel);

        if (pRenderTarget->EndDraw() < 0) {
            break;
        }

        UpdateLayeredWindowIndirect(hwnd, &layeredInfo);

        Sleep(30);
    }

台式机测试:奔腾双核下,纯GDI渲染CPU占用率30%-50%,平均35%。使用D2D渲染占用率10%-30%,平均15%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值