Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net Compact Framework上使用面板模拟动画_C#_Winforms_Animation_Compact Framework - Fatal编程技术网

C# 在.Net Compact Framework上使用面板模拟动画

C# 在.Net Compact Framework上使用面板模拟动画,c#,winforms,animation,compact-framework,C#,Winforms,Animation,Compact Framework,我正在用.Net Compact Framewor 2.0 SP2和.strong>开发一个Windows Mobile 5.0或更高版本的 我试图“动画化”五个面板在计时器滴答声事件中改变它们的位置,但是这些面板移动得非常糟糕。他们像跳跃一样移动 我做错了什么 谢谢。您要交换屏幕面板吗?这可能需要一个屏幕,然后重新绘制,这是一个灾难。该设备甚至可能没有硬件加速功能(而且模拟器显示驱动程序非常非常糟糕) 如果你想在移动设备上“制作动画”,你必须画一个屏幕外的缓冲区,然后一次将结果显示在屏幕上,并

我正在用.Net Compact Framewor 2.0 SP2和.strong>开发一个Windows Mobile 5.0或更高版本的

我试图“动画化”五个面板在计时器滴答声事件中改变它们的位置,但是这些面板移动得非常糟糕。他们像跳跃一样移动

我做错了什么


谢谢。

您要交换屏幕面板吗?这可能需要一个屏幕,然后重新绘制,这是一个灾难。该设备甚至可能没有硬件加速功能(而且模拟器显示驱动程序非常非常糟糕)

如果你想在移动设备上“制作动画”,你必须画一个屏幕外的缓冲区,然后一次将结果显示在屏幕上,并尽量使显示的内容尽可能小


MSDN提供了您可能想查看的内容。

不确定上面关于使用矩形的评论,但我们使用双缓冲。简而言之,您创建了一个位图(具有所需的大小,在您的情况下是面板的大小)。创建后,从位图创建图形对象。此时,您已经创建了一个屏幕外缓冲区

渲染:
对于OnPaint方法中的所有图形调用(DrawString等),请使用创建的位图中的图形对象。此时,您正在进入内存,而不是屏幕

绘制完成后,将屏幕外缓冲区复制到屏幕上。为此,请使用传递给OnPaint方法的图形对象的DrawImage方法。此调用的参数是为屏幕外缓冲区创建的位图。


为什么这样做?
你看到的闪烁被称为“撕裂”。您的眼睛正在捕捉屏幕上的实际图形。双缓冲区限制了这一点,将所有的绘图都保存到内存中,完成后,它会在一次调用中将其复制到屏幕


希望这有帮助

…移动非常糟糕。它们像跳跃一样移动。
你能说得更具体一点吗?是的,它移动不平稳。50毫秒应该足够平滑-你的硬件是否支持间隔如此低的计时器?你在普通电脑上试过同样的代码吗?我在模拟器上试过。我认为错误就在这里:我正在更新Top,每个刻度增加5个像素。如果我做Panel.Top+=1;“一切正常。@查理:所有Windows CE设备都支持低至1ms分辨率的计时器。我一直在尝试按照你告诉我的那样,使用矩形而不是面板,并绘制到屏幕外缓冲区,但动画效果更差。现在,使用Panel.Left+=1和5毫秒的间隔,它可以平稳地移动。您是说在继承自Panel的自定义控件上执行此操作吗?我不知道如何在另一个控件上绘制具有双缓冲区的System.Windows.Form.Panel对象。上面是针对用户控件的,而不是System.Windows.Form.Panel。你不需要面板。您的新控件将需要属性来从计时器事件中增加动画。