Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начинает операцию буферизованной анимации. Анимация состоит из переключения между содержимым двух буферов за указанный период времени.
Синтаксис
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
);
Параметры
hwnd
Тип: HWND
Дескриптор окна, в котором воспроизводится анимация.
hdcTarget
Тип: HDC
Дескриптор целевого контроллера домена, на котором анимирован буфер.
prcTarget
Тип: const RECT*
Указатель на структуру, указывающую область целевого контроллера домена, в которой необходимо нарисовать.
dwFormat
Тип: BP_BUFFERFORMAT
Формат буфера.
[in] pPaintParams
Тип: BP_PAINTPARAMS*
Указатель на структуру, которая определяет параметры операции рисования. Это значение может быть NULL.
[in] pAnimationParams
Тип: BP_ANIMATIONPARAMS*
Указатель на структуру, которая определяет параметры операции анимации.
[out] phdcFrom
Тип: HDC*
Когда эта функция возвращается, это значение указывает на дескриптор контроллера домена, где приложение должно зарисовать начальное состояние анимации, если не NULL.
[out] phdcTo
Тип: HDC*
Когда эта функция возвращается, это значение указывает на дескриптор контроллера домена, где приложение должно закрасить окончательное состояние анимации, если не NULL.
Возвращаемое значение
Тип: HANIMATIONBUFFER
Дескриптор буферизованной анимации краски.
Замечания
BeginBufferedAnimation будет заботиться о рисовании промежуточных кадров между этими двумя состояниями путем создания нескольких WM_PAINT сообщений.
BeginBufferedAnimation запускает таймер, который создает WM_PAINT сообщения, на которых следует вызывать BufferedPaintRenderAnimation . Во время этих сообщений BufferedPaintRenderAnimation возвращает ЗНАЧЕНИЕ TRUE , когда он красит промежуточный кадр, чтобы учесть, что приложение не имеет дальнейших действий по рисованию.
Если длительность анимации равна нулю, возвращается только phdcTo , а phdcFrom имеет значение NULL. В этом случае приложение должно зарисовать окончательное состояние с помощью phdcTo , чтобы получить поведение, аналогичное BeginBufferedPaint.
Примеры
В следующем примере кода показано, как использовать эту функцию.
#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);
}
}
Требования
| Требование | Ценность |
|---|---|
| Минимальный поддерживаемый клиент | Windows Vista [только классические приложения] |
| минимальный поддерживаемый сервер | Windows Server 2008 [только классические приложения] |
| целевая платформа | Виндоус |
| Header | uxtheme.h |
| Library | Uxtheme.lib |
| DLL | UxTheme.dll |