代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

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

  •  1
  • B.Gen.Jack.O.Neill  · 技术社区  · 14 年前

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

    我在过去几年里所做的所有编程工作都是在汇编程序中完成的,主要是8051和AVR,就像C语言中的WEEL一样,但也适用于微控制器。我对硬件比软件更着迷。但我也对操作系统的功能、它的API等着迷。几天后,我告诉我的朋友,如果你有数学解析器,创建一个非常简单的程序来绘制函数图应该非常容易。他不相信我,所以我试着做了一个。

    我决定和C一起去,即使我不知道OOP。但我认为,如果我把所有的事情都做成一个按钮的动作,它会像一个好的老C。

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

    但我注意到一些奇怪的事情,当我把我的程序最小化,画出不和谐的画。这让我思考了一下如何在系统级完成所有的绘图。

    我认为系统会一直保持活动窗口的图像,直到它改变。所以当你移动你的窗户时,它只会改变它在法梅布夫的位置。当你缩小它的时候,它只是在绘图时跳过它到帧缓冲区。

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

    而且,这让我想到在C和.NET库中,函数是什么,它只是对WinAPI函数的调用,它的工作方式完全相同,有多少库和函数可以做更多的事情。就像在gdi中没有绘制线条的函数,而您只能绘制点一样,C将添加从这些点绘制线条的函数。希望你能理解我。

    谢谢您。

    4 回复  |  直到 6 年前
        1
  •  5
  •   steinar Justin CI    14 年前

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

    如果您真的对这些东西感兴趣,并且想更深入地了解系统如何处理绘图(以及其他事情,如Windows消息),我建议您阅读更多关于win32 API的内容,例如从Charles Petzold的经典开始, Programming Windows .

        2
  •  2
  •   Jonathan Hall    6 年前

    你的画没有消失,只是没有消失。容忍我:

    • 要在Windows窗口上绘制,必须响应wm_paint消息指示的回调。当时是3.11胜,现在是这样。
    • 单击按钮绘制是浪费时间的,因为下一个窗体/控件/窗口重新绘制将在那里绘制背景色。
    • 将按钮事件处理程序中的相同代码移动到 OnPaint -当然,处理语义上的差异
    • Windows不保存屏幕缓冲区的副本-您的绘图-因此您必须将其保存到某个位置或动态绘制。
        3
  •  1
  •   Christian V    14 年前

    在Windows中(在vista/dwm和mil之前),应用程序负责绘制自己的GUI。也就是说,当操作系统告诉应用程序这样做时,应用程序必须绘制自己的GUI。调整窗体大小或移动窗体将触发绘制事件。这就是它在user32+gdi中的工作方式。也就是说,应用程序绘制自己的像素。

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

        4
  •  0
  •   Stefan Steiger Marco van de Voort    14 年前

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

    或ZeDigice http://zedgraph.org/

    如果您想自己绘制:当您调整大小时,窗口会重新绘制。
    您需要在重绘事件上重绘您的绘图,或者它被称为什么。
    这是完全正常的。

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