如何在VB6 PictureBox的Paint事件中执行自己的重绘?

时间:2009-01-30 21:47:10

标签: vb6

当他试图运行我们正在处理的VB6应用程序时,同事遇到错误。错误是“480:无法创建AutoRedraw图像”。微软的文档说这是因为“AutoRedraw属性没有足够的可用内存设置为True。将AutoRedraw属性设置为False并在Paint事件过程中执行自己的重绘或使PictureBox控件或Form对象变小。 ..“

使PictureBox变小不是一个选择。我很高兴“......在Paint事件程序中执行我自己的重绘......”,但我不知道该怎么做。有人能给我指路吗?

4 个答案:

答案 0 :(得分:1)

如果没有细节,这将是一个简单的答案。一般来说,大多数初级VB6程序员使用AutoRedraw = True draw来响应某些输入。填写一些数据,点击绘图,它出现在图片框中。

绘图按钮中的单击事件与您的绘图代码相关联。第一步是将对绘图代码的调用移动到图片的绘制事件。第二步是用MyPictureBox.Refresh替换对绘图代码的所有调用。刷新会强制触发该图片框的绘制事件。

您需要关注的主要问题是每次表单需要刷新时都会触发paint事件。就像移动覆盖它的窗户一样。这意味着您的绘图代码中的任何速度问题都将暴露出来。 AutoRedraw = True将您绘制的内容放入一个隐藏的位图中,PictureBox用它来显示您绘制的内容。

Paint事件将执行绘图过程的每一步,因此您必须确保尽可能快。根据您的应用程序的动态程度,更慢的问题将变得更加严重。如果您正在显示静态图像,那么问题就不那么糟了。

答案 1 :(得分:1)

  

使PictureBox变小不是一个选择。我很高兴“......在Paint事件程序中执行我自己的重绘......”,但我不知道该怎么做。有人能给我指路吗?

这很容易。您只需实现Form或PictureBox的_Paint() - Event并绘制。

因为你问,我想我应该澄清AutoRedraw-Propeprty的作用。如果设置为true,您可以“以任意方式绘制图像”。分多步进行。随你。如果需要重新绘制,例如,因为另一个窗口位于顶部,它将会神奇地完成。对于绘图部分,下部站点很慢。

如果AutoRedraw为false,则不会发生任何魔法。 Paint() - 事件将被触发,您有责任再次绘制图像。如果您的窗口经常没有“无效”(例如“覆盖”),这将会快得多。或者你正在做很多绘画。

或者你的“神奇空间”内存不足; - )

答案 2 :(得分:1)

如果您不介意重写图形代码以使用GDI API - 这可能是一项相当大的任务 - 我在VB6讨论组中找到了thread from 2006,其中Mike Sutton在回答中说类似的问题:

  VB的后台缓冲区实现使用了一个   要存储的设备相关位图(DDB)   图像数据非常有限   它的大小。在老年人   OS'这曾经是〜16mb未压缩   数据大小,在以后的操作系统上已经存在   扩大但仍然相当   限制。

     

解决方法是使用a   设备无关位图(DIB)和   自己管理GDI资源,   看看我的DIB article   网站以获取如何工作的示例   和他们一起。

我自己没试过。

答案 3 :(得分:-1)

在表单代码窗口中通常会有一个用于控件的下拉框事件。你需要选择油漆事件:

Private Sub object_Paint()

并填写您的代码以便在PictureBox上绘图。