C#绘图消失(实际上更多的系统问题)

时间:2010-10-14 22:01:58

标签: c# drawing system

好的,我相信你们中的一些人已经知道我的头衔发生了什么,因为我知道这是非常常见的问题。但我的问题实际上更深一点,所以请耐心等待我。

我过去几年所做的所有编程都是在Assembler中,主要是8051,AVR和C一样,但也适用于微控制器。我对HW比SW更着迷。但我也对OS的功能,它的API等着迷。几天后我告诉我的朋友,如果你有数学解析器,创建一个非常简单的程序绘制函数图应该很容易。他不相信我,所以我试图制作一个。

我决定使用C#,即使我不了解OOP。但我认为,如果我在一个按钮动作中完成所有操作,那就像是老C一样。

所以我让数学解析器工作,然后开始使用Pen对象绘制。我的第一次尝试是绘制简单的线条。在阅读了一个教程之后,我设法这样做,并为我的情节创建了简单的轴。

但是我注意到一些奇怪的事情,当我最小化我的程序时,画出了消息。这让我想一想所有绘图是如何在系统级别完成的。

我认为系统保持活动窗口的图像直到它改变了。所以当你移动你的窗户时,它只会改变它在famebuffer中的位置。当你最小化它时,它只是在drawind到framebuffer时跳过它。

但我看到它不是这样的。那么,拜托,你能告诉我为什么会这样吗?我可以在许多教程中阅读如何防止它,但我想知道更多原因。更多的是,这是因为系统API的工作原理,或者是因为C#绘图类的工作原理。

另外,这让我觉得C#和.NET库中的功能只是调用WinAPI函数,它的工作方式完全相同,以及有多少库和函数可以做更多事情。就像在GDI中没有绘制线条的功能一样,你只能画点,而C#会添加从这个点画线的功能。我希望你理解我。

谢谢。

4 个答案:

答案 0 :(得分:5)

这是它在Win32 API中的工作方式。当窗口最小化时,它占用的区域变得“无效”,因此Windows系统知道需要重新绘制该区域的屏幕。这导致WM_PAINT消息被发送到负责绘制该区域的Windows程序。您可以阅读有关使客户区域(您的程序负责的区域)here无效的更多信息。

如果您真的对这些内容感兴趣并希望深入了解系统如何处理绘图(以及其他内容,如Windows消息),我建议您在Win32 API上阅读更多内容,例如:从Charles Petzold的经典作品Programming Windows开始。

答案 1 :(得分:2)

你的绘画并没有消失,它根本就不存在。忍受我:

  • 要在Windows窗口上绘图,您必须响应WM_PAINT消息指示的回调。它在Win 3.11中,现在是如此。
  • 点击按钮点击是浪费时间,因为下一个表单/控件/窗口重新绘制会在那里绘制背景颜色
  • 将相同的代码从按钮事件处理程序移动到OnPaint - 当然,处理语义上的差异
  • windows不保存屏幕缓冲区的副本 - 你的绘图 - 所以你必须将它保存在某处或者即时绘制

答案 2 :(得分:1)

在Windows(Vista / DWM和MIL之前)中,应用程序负责绘制自己的GUI。也就是说,当操作系统告诉应用程序这样做时,应用程序必须绘制自己的GUI。调整或移动表单将触发绘制事件。这是它在User32 + GDI中的工作方式。也就是说,应用程序绘制自己的像素。

然而,WPF应用程序将使用媒体集成层(Vista和Windows 7),“mil core”负责绘制应用程序的可视树。在这种情况下,操作系统负责呈现,但应用程序负责其想要呈现的内容。

答案 3 :(得分:0)

如果要绘图,请使用microsoft图表控件。 http://www.microsoft.com/downloads/en/details.aspx?FamilyId=130F7986-BF49-4FE5-9CA8-910AE6EA442C&displaylang=en

或ZedGraph http://zedgraph.org/

如果您想自己绘图:调整大小时窗口会重新绘制 您需要在重绘事件或其他任何内容上重绘您的绘图 这是完全正常的。

另外,使用.NET 4.0,因为除非你删除(重绘)所有内容,否则你不可能删除以编程方式绘制的任何内容。