BeginBufferedAnimation-Funktion (uxtheme.h)

Startet einen gepufferten Animationsvorgang. Die Animation besteht aus einer Kreuzüberblendung zwischen den Inhalten von zwei Puffern über einen bestimmten Zeitraum.

Syntax

HANIMATIONBUFFER BeginBufferedAnimation(
        HWND               hwnd,
        HDC                hdcTarget,
        const RECT         *prcTarget,
        BP_BUFFERFORMAT    dwFormat,
  [in]  BP_PAINTPARAMS     *pPaintParams,
  [in]  BP_ANIMATIONPARAMS *pAnimationParams,
  [out] HDC                *phdcFrom,
  [out] HDC                *phdcTo
);

Parameter

hwnd

Typ: HWND

Ein Handle für das Fenster, in dem die Animationen wiedergegeben werden.

hdcTarget

Typ: HDC

Ein Handle des Ziel-DC, auf dem der Puffer animiert wird.

prcTarget

Typ: const RECT*

Ein Zeiger auf eine Struktur, der den Bereich des Ziel-DC angibt, in dem gezeichnet werden soll.

dwFormat

Typ: BP_BUFFERFORMAT

Das Format des Puffers.

[in] pPaintParams

Typ: BP_PAINTPARAMS*

Ein Zeiger auf eine Struktur, die die Farbvorgangsparameter definiert. Dieser Wert kann NULL sein.

[in] pAnimationParams

Typ: BP_ANIMATIONPARAMS*

Ein Zeiger auf eine Struktur, die die Parameter des Animationsvorgangs definiert.

[out] phdcFrom

Typ: HDC*

Wenn diese Funktion zurückgibt, verweist dieser Wert auf den Handle des DC, in dem die Anwendung den Anfangszustand der Animation zeichnen soll, wenn nicht NULL.

[out] phdcTo

Typ: HDC*

Wenn diese Funktion zurückgibt, verweist dieser Wert auf den Handle des DC, in dem die Anwendung den endgültigen Zustand der Animation zeichnen soll, wenn nicht NULL.

Rückgabewert

Typ: HANIMATIONBUFFER

Ein Handle für die gepufferte Farbanimation.

Hinweise

BeginBufferedAnimation übernimmt das Zeichnen der Zwischenrahmen zwischen diesen beiden Zuständen, indem mehrere WM_PAINT Nachrichten generiert werden.

BeginBufferedAnimation startet einen Timer, der WM_PAINT Nachrichten generiert, für die BufferedPaintRenderAnimation aufgerufen werden soll. Während dieser Meldungen gibt BufferedPaintRenderAnimationTRUE zurück, wenn ein Zwischenrahmen erstellt wird, um zu signalisieren, dass die Anwendung keine weitere Malerei ausführen muss.

Wenn die Animationsdauer 0 ist, wird nur phdcTo zurückgegeben, und phdcFrom ist auf NULL festgelegt. In diesem Fall sollte die Anwendung den endgültigen Zustand mithilfe von phdcTo zeichnen, um das Verhalten ähnlich wie BeginBufferedPaint zu erhalten.

Beispiele

Im folgenden Codebeispiel wird die Verwendung dieser Funktion veranschaulicht.

#include <windows.h>
#include <tchar.h>
#include <uxtheme.h>

#pragma comment(lib, "uxtheme.lib")

#define WNDCLASSNAME L"BufferedPaintSample_WndClass"
#define ANIMATION_DURATION 500

bool g_fCurrentState = true;
bool g_fNewState = true;

void StartAnimation(HWND hWnd)
{
    g_fNewState = !g_fCurrentState;
    InvalidateRect(hWnd, NULL, TRUE);
}

void Paint(HWND hWnd, HDC hdc, bool state)
{
    RECT rc;
    GetClientRect(hWnd, &rc);
    FillRect(hdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
    LPCTSTR pszIconId = state ? IDI_APPLICATION : IDI_ERROR;
    HICON hIcon = LoadIcon(NULL, pszIconId);
    if (hIcon)
    {
        DrawIcon(hdc, 10, 10, hIcon);
        DestroyIcon(hIcon);
    }
}

void OnPaint(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    if (hdc)
    {
        // See if this paint was generated by a soft-fade animation
        if (!BufferedPaintRenderAnimation(hWnd, hdc))
        {
            BP_ANIMATIONPARAMS animParams;
            ZeroMemory(&animParams, sizeof(animParams));
            animParams.cbSize = sizeof(BP_ANIMATIONPARAMS);
            animParams.style = BPAS_LINEAR;
            
            // Check if animation is needed. If not set dwDuration to 0
            animParams.dwDuration = (g_fCurrentState != g_fNewState ? ANIMATION_DURATION : 0);

            RECT rc;
            GetClientRect(hWnd, &rc);

            HDC hdcFrom, hdcTo;
            HANIMATIONBUFFER hbpAnimation = BeginBufferedAnimation(hWnd, hdc, &rc,
                BPBF_COMPATIBLEBITMAP, NULL, &animParams, &hdcFrom, &hdcTo);
            if (hbpAnimation)
            {
                if (hdcFrom)
                {
                    Paint(hWnd, hdcFrom, g_fCurrentState);
                }
                if (hdcTo)
                {
                    Paint(hWnd, hdcTo, g_fNewState);
                }

                g_fCurrentState = g_fNewState;
                EndBufferedAnimation(hbpAnimation, TRUE);
            }
            else
            {
                Paint(hWnd, hdc, g_fCurrentState);
            }
        }
        
        EndPaint(hWnd, &ps);
    }
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_LBUTTONDOWN:
        StartAnimation(hWnd);
        break;
    case WM_PAINT:
        OnPaint(hWnd);
        break;
    case WM_SIZE:
        BufferedPaintStopAllAnimations(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

int WINAPI _tWinMain(HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPSTR     lpCmdLine,
     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    if (SUCCEEDED(BufferedPaintInit()))
    {
        WNDCLASSEX wcex;
        ZeroMemory(&wcex, sizeof(wcex));
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style = CS_HREDRAW|CS_VREDRAW;
        wcex.lpfnWndProc = WndProc;
        wcex.hInstance = hInstance;
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wcex.lpszClassName = WNDCLASSNAME;
        RegisterClassEx(&wcex);

        HWND hWnd = CreateWindow(WNDCLASSNAME, L"Buffered Paint Sample", 
            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 
            CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

        if (hWnd)
        {
            ShowWindow(hWnd, nCmdShow);
            UpdateWindow(hWnd);

            MSG msg;
            while (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }

        BufferedPaintUnInit();
    }

    return 0;
}

void BufferedPaint(HDC hdc, const RECT *prcPaint)
{
    BP_PAINTPARAMS paintParams = {0};
    paintParams.cbSize = sizeof(paintParams);

    HDC hdcBuffer;
    HPAINTBUFFER hBufferedPaint = BeginBufferedPaint(hdc, prcPaint, 
        BPBF_COMPATIBLEBITMAP, &paintParams, &hdcBuffer);

    if (hBufferedPaint)
    {
        // Application specific painting code
        AppPaint(hdcBuffer, prcPaint);
        EndBufferedPaint(hBufferedPaint, TRUE);
    }
    else
    {
        // Error occurred, default to unbuffered painting
        AppPaint(hdc, prcPaint);
    }
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile uxtheme.h
DLL UxTheme.dll