Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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
Winforms 是否有类似于Qt';Windows窗体中的QCanvas?_Winforms_Qt_Canvas - Fatal编程技术网

Winforms 是否有类似于Qt';Windows窗体中的QCanvas?

Winforms 是否有类似于Qt';Windows窗体中的QCanvas?,winforms,qt,canvas,Winforms,Qt,Canvas,我已经编写了一个Windows窗体应用程序来解决难题。目前,使用PaintEventHandler在应用程序主窗口的面板上绘制拼图网格。PaintEventHandler调用的方法每次调用时都会重新绘制整个网格。虽然这种方法有效,但它是不稳定和低效的,我想用更平滑的方法来代替它 我已经用Qt编写了许多类似的应用程序。使用Qt,我将创建一个QCanvas和一个QCanvas视图。然后,我可以向QCanvas添加对象或从中删除对象,并在QCanvas视图上调用update()方法,以查看更改是否生效

我已经编写了一个Windows窗体应用程序来解决难题。目前,使用PaintEventHandler在应用程序主窗口的面板上绘制拼图网格。PaintEventHandler调用的方法每次调用时都会重新绘制整个网格。虽然这种方法有效,但它是不稳定和低效的,我想用更平滑的方法来代替它

我已经用Qt编写了许多类似的应用程序。使用Qt,我将创建一个QCanvas和一个QCanvas视图。然后,我可以向QCanvas添加对象或从中删除对象,并在QCanvas视图上调用
update()
方法,以查看更改是否生效而不闪烁

我尝试过的另一种方法是保留对用于绘制面板的
图形
对象的引用,并尝试在绘制事件之外在其上绘制。这不起作用:我得到了一个毫无帮助的
ArgumentException:参数无效
异常,我只能假设该异常是由Windows引发的,因为当时它不希望应用程序进行任何绘制


是否有类似于用于Windows窗体的QCanvas的功能?如果没有,我应该使用什么方法来更新拼图网格?

WindowsForms控件的
绘制事件通常有一个上下文区域设置为仅重新绘制控件中必要的部分。这一点,再加上将双缓冲区设置为true,通常就足以解决大多数重绘问题

此外,您将获得异常,因为您正在缓存的
图形
对象在绘制事件完成时被释放


假设双缓冲不足,一种可行的方法是在绘制事件中在屏幕上绘制时,对屏幕外的
位图进行绘制。或者,将位图托管在
PictureBox
中,并让其自动重画。

WindowsForms控件的
绘制事件通常有一个上下文区域设置为仅重画控件中必要的部分。这一点,再加上将双缓冲区设置为true,通常就足以解决大多数重绘问题

此外,您将获得异常,因为您正在缓存的
图形
对象在绘制事件完成时被释放


假设双缓冲不足,一种可行的方法是在绘制事件中在屏幕上绘制时,对屏幕外的
位图进行绘制。或者,将位图放在
图片盒中,让它自动重画。

快速思考-试试PyQt怎么样?QCanvas和QCanvasView应该在任何平台上都能正常工作。快速思考-试试PyQt怎么样?QCanvas和QCanvasView应该在任何平台上都能正常工作

感谢您的帮助回答,您给了我一些探索的想法。本周晚些时候我会再看一看,如果一切顺利,我会接受你的答案:)。我现在正在使用双缓冲区,并在Paint事件中将重画区域限制为剪辑矩形,现在效果好多了。这比使用Qt需要做更多的工作。它还让我想起了在RISC操作系统中编写窗口重画代码——快乐的日子!:)再次感谢。谢谢你的帮助性回答,你给了我一些想法去探索。本周晚些时候我会再看一看,如果一切顺利,我会接受你的答案:)。我现在正在使用双缓冲区,并在Paint事件中将重画区域限制为剪辑矩形,现在效果好多了。这比使用Qt需要做更多的工作。它还让我想起了在RISC操作系统中编写窗口重画代码——快乐的日子!:)再次感谢。我已经在用PyQt了。事实上,我所有的Qt编程都是这样做的!然而,这个练习的重点是学习Windows窗体,所以使用PyQt会弄巧成拙。好吧,酷——这只是一个想法。祝你一切顺利,祝石阁项目好运。我已经在使用PyQt了。事实上,我所有的Qt编程都是这样做的!然而,这个练习的重点是学习Windows窗体,所以使用PyQt会弄巧成拙。好吧,酷——这只是一个想法。祝你一切顺利,祝石阁项目好运。