我编写了一个Windows窗体应用程序来解决Shikaku个难题。目前,拼图网格使用PaintEventHandler在应用程序主窗口的Panel上绘制。 PaintEventHandler调用的方法每次调用时都会重绘整个网格。虽然这种方法有效,但它是闪烁和低效的,我想用更平滑的东西替换它。
我在Qt中编写了许多类似的应用程序。使用Qt,我将创建一个QCanvas和一个QCanvasView。然后我可以在QCanvas中添加对象或从QCanvas中删除对象,并在QCanvasView上调用update()
方法,看看更改是否生效而没有闪烁。
我尝试过的一种替代方法是保留对用于绘制Panel的Graphics
对象的引用,并尝试在Paint事件之外绘制它。这不起作用:我得到了一个相当无益的ArgumentException: Parameter is not valid
异常,我只能假设它被Windows抛出,因为它不期望应用程序在那时做任何绘画。
是否有类似于Windows窗体的QCanvas?如果没有,我应该使用什么方法来更新拼图网格?
答案 0 :(得分:1)
WindowsForms控件的Paint
事件通常将上下文区域设置为仅重绘控件的必要部分。这与将DoubleBuffered
设置为true相结合,通常足以解决大多数重新绘制的问题。
此外,您正在获取异常,因为您正在缓存的Graphics
对象在绘制事件完成时为Disposed。
假设DoubleBuffering是不够的,一种可行的方法是,当您在Paint事件中在屏幕上绘制时,将绘图绘制到屏幕外Bitmap
。或者,在PictureBox
中托管位图,然后自动重绘。
答案 1 :(得分:0)