使用 GDI+ 在C++中制作流畅的动画

Smooth animations with GDI+ in C++

本文关键字:动画 GDI+ C++ 使用      更新时间:2023-10-16

我在C++中使用GDI+获得简单的平滑动画时遇到了问题。我目前的方法是使用 WinAPI 计时器,如此处所述。我正在以 15ms 的间隔使用SetTimer初始化计时器。比,当相应的WM_TIMER事件发生时,我会递增整流器的左上角坐标,为整个屏幕调用InvalidateRect并绘制整流器。结果是按预期移动,但有规律的闪烁(见视频(。这似乎随间隔而变化,但它始终存在。

问题是如何修改此方法以实现流畅的动画?我发现的大多数类似问题都与 C# 有关,其中工具集似乎略有不同。

编辑:忘了添加 - 这是一个学校项目,所以改变技术或语言对我来说不是一个真正的选择。

InvalidateRect中使用FALSE标志进行bErase

InvalidateRect( hwnd, NULL, FALSE );

或处理WM_ERASEBKGND消息

LRESULT CALLBACK YourWindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
switch ( msg )
{
case WM_ERASEBKGND:
// Don't paint background if you are blitting from off screen surface.
return 1;
}
return DefWindowProc( hwnd, msg, wparam, lparam );
}

或者把NULL画笔放在窗口类(用于RegisterClass(定义中。