当他试图运行我们正在处理的VB6应用程序时,同事遇到错误。错误是“480:无法创建AutoRedraw图像”。微软的文档说这是因为“AutoRedraw属性没有足够的可用内存设置为True。将AutoRedraw属性设置为False并在Paint事件过程中执行自己的重绘或使PictureBox控件或Form对象变小。 ..“
使PictureBox变小不是一个选择。我很高兴“......在Paint事件程序中执行我自己的重绘......”,但我不知道该怎么做。有人能给我指路吗?
答案 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上绘图。