2010-06-08 32 views
0

我想问一些关于如何在Compact Framework中优化重绘的建议? GetHashCode()没有帮助,因为它总是返回不同的哈希码。NETCF - 优化重新绘制(onPaint)

无论如何,我有一个程序,您可以在运行时拖动和调整对象的大小。这个对象是一个透明的对象,它有一个PNG图像,它也可以根据对象客户端大小动态调整大小。尽管我注意到了(例如,我有4个透明对象,并且正在拖动或调整其中一个),但即使3不移动,它们中的4个也会触发OnPaintBackground。另一个当我只是在一个对象上敲击时,它触发onPaintBacground()。无论如何,当这些事件被触发时我没有问题。

我喜欢做的是优化,这意味着我只需要在必要时重新绘制对象。

你们能给我们一个建议吗?

这里是我的伪C#代码提前

Bitmap _backBuff; 
onResize() { 
    if(_backBuff != null) _backBuff.Dispose(); 
    _backBuff = new Bitmap(ClientSize.Width, ClientSize.Height); 
    Invalidate(); 
} 

onPaintBackground(e) /*have to use onPaintBackground because MSDN said it's faster*/ { 
    using(Graphics g = Graphics.FromImage(_backBuff)) { 
     g.Clear(Color.Black); 

     // draw background 
     ....some interface calling here 
     ....and paint the background 

     // draw alpha PNG 
     .. get hDc 
     .. paint PNG 
     .. release hDc 
    } 

    e.Graphics.DrawImage(_backBuff,0,0); 
} 

感谢。

+0

OnPaintBackground更快吗?你能否提供该陈述的参考? 通常,当我在WinCE中绘制透明的东西时,我会重写paintBackground并将它留下_empty_,然后在Paint中绘制我的东西。 – Quibblesome 2010-06-08 18:29:31

回答

1

想到了一个想法

我必须检查旧位置之间的新位置或新尺寸差异。如果其中一个是新的,则执行重绘..否则..绘制_backBuff(充当缓存映像)。

我实现了它,它对于重新绘制或绘制缓存看起来不错。

+0

你们有点肮脏的检查应该像刚才那样完成这项工作。 另一种可能性是执行一个对象内的所有项目的绘制,而不是让几个较小的对象全部自行绘制。这将有助于您更好地控制绘画,但需要花费一些时间进行设置。 – Quibblesome 2010-06-08 18:28:36