Drawing in layered window with Direct2D

来源:互联网 发布:淘宝手工护肤品黑名单 编辑:程序博客网 时间:2024/06/17 22:01

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%。

原创粉丝点击