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 |