Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Commence une opération d’animation mise en mémoire tampon. L’animation se compose d’un fondu croisé entre le contenu de deux mémoires tampons sur une période spécifiée.
Syntaxe
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
);
Paramètres
hwnd
Handle vers la fenêtre dans laquelle les animations sont lues.
hdcTarget
Type : HDC
Handle du contrôleur de domaine cible sur lequel la mémoire tampon est animée.
prcTarget
Type : const RECT*
Pointeur vers une structure qui spécifie la zone du contrôleur de domaine cible dans laquelle dessiner.
dwFormat
Type : BP_BUFFERFORMAT
Format de la mémoire tampon.
[in] pPaintParams
Type : BP_PAINTPARAMS*
Pointeur vers une structure qui définit les paramètres d’opération de peinture. Cette valeur peut être NULL.
[in] pAnimationParams
Type : BP_ANIMATIONPARAMS*
Pointeur vers une structure qui définit les paramètres d’opération d’animation.
[out] phdcFrom
Type : HDC*
Lorsque cette fonction est retournée, cette valeur pointe vers le handle du contrôleur de domaine dans lequel l’application doit peindre l’état initial de l’animation, s’il n’est pas NULL.
[out] phdcTo
Type : HDC*
Lorsque cette fonction est retournée, cette valeur pointe vers le handle du contrôleur de domaine dans lequel l’application doit peindre l’état final de l’animation, s’il n’est pas NULL.
Valeur retournée
Type : HANIMATIONBUFFER
Handle de l’animation de peinture mise en mémoire tampon.
Remarques
BeginBufferedAnimation s’occupe de dessiner les cadres intermédiaires entre ces deux états en générant plusieurs messages WM_PAINT .
BeginBufferedAnimation démarre un minuteur qui génère des messages WM_PAINT sur lesquels BufferedPaintRenderAnimation doit être appelé. Pendant ces messages, BufferedPaintRenderAnimation retourne TRUE lorsqu’il peint un cadre intermédiaire, pour indiquer que l’application n’a plus de peinture à faire.
Si la durée de l’animation est égale à zéro, seul phdcTo est retourné et phdcFrom a la valeur NULL. Dans ce cas, l’application doit peindre l’état final à l’aide de phdcTo pour obtenir le comportement similaire à BeginBufferedPaint.
Examples
L’exemple de code suivant montre comment utiliser cette fonction.
#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);
}
}
Spécifications
| Requirement | Valeur |
|---|---|
| Client minimum requis | Windows Vista [applications de bureau uniquement] |
| Serveur minimal pris en charge | Windows Server 2008 [applications de bureau uniquement] |
| plateforme cible | Fenêtres |
| Header | uxtheme.h |
| Library | Uxtheme.lib |
| DLL | UxTheme.dll |