Fungsi BeginBufferedAnimation (uxtheme.h)
Memulai operasi animasi yang di-buffer. Animasi terdiri dari memudar silang antara konten dua buffer selama periode waktu tertentu.
Sintaks
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
Jenis: HWND
Handel ke jendela tempat animasi diputar.
hdcTarget
Jenis: HDC
Handel DC target tempat buffer dianimasikan.
prcTarget
Jenis: const RECT*
Penunjuk ke struktur yang menentukan area target DC untuk menggambar.
dwFormat
Jenis: BP_BUFFERFORMAT
Format buffer.
[in] pPaintParams
Jenis: BP_PAINTPARAMS*
Penunjuk ke struktur yang mendefinisikan parameter operasi cat. Nilai ini bisa NULL.
[in] pAnimationParams
Jenis: BP_ANIMATIONPARAMS*
Penunjuk ke struktur yang menentukan parameter operasi animasi.
[out] phdcFrom
Jenis: HDC*
Ketika fungsi ini kembali, nilai ini menunjuk ke handel DC tempat aplikasi harus melukis status awal animasi, jika bukan NULL.
[out] phdcTo
Jenis: HDC*
Ketika fungsi ini kembali, nilai ini menunjuk ke handel DC tempat aplikasi harus melukis status akhir animasi, jika bukan NULL.
Mengembalikan nilai
Jenis: HANIMATIONBUFFER
Handel ke animasi cat buffer.
Keterangan
BeginBufferedAnimation akan mengurus gambar bingkai perantara antara kedua status tersebut dengan menghasilkan beberapa pesan WM_PAINT .
BeginBufferedAnimation memulai timer yang menghasilkan pesan WM_PAINT di mana BufferedPaintRenderAnimation harus dipanggil. Selama pesan ini, BufferedPaintRenderAnimation akan mengembalikan TRUE ketika melukis bingkai perantara, untuk menandakan bahwa aplikasi tidak memiliki lukisan lebih lanjut untuk dilakukan.
Jika durasi animasi adalah nol, maka hanya phdcTo yang dikembalikan dan phdcFrom diatur ke NULL. Dalam hal ini, aplikasi harus melukis status akhir menggunakan phdcTo untuk mendapatkan perilaku yang mirip dengan BeginBufferedPaint.
Contoh
Contoh kode berikut menunjukkan cara menggunakan fungsi ini.
#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);
}
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows Vista [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2008 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | uxtheme.h |
DLL | UxTheme.dll |