2009-01-30 55 views
1

一位同事在嘗試運行我們正在開發的VB6應用程序時遇到錯誤。錯誤是「480:無法創建AutoRedraw圖像」。 Microsoft的文檔說這是因爲「沒有足夠的可用內存將AutoRedraw屬性設置爲True。將AutoRedraw屬性設置爲False,並在Paint事件過程中執行自己的重繪,或者使PictureBox控件或Form對象更小。 ..「如何在VB6 PictureBox的Paint事件中執行自己的重繪?

使PictureBox變小不是一個選項。我很高興「......在Paint事件過程中執行我自己的重繪...」,但我不知道如何去做。有人能告訴我方式嗎?

回答

1

沒有詳細信息,這將是一個簡單的答案。一般來說,大多數開始的VB6程序員使用AutoRedraw = True draw來響應某些輸入。填寫一些數據,點擊繪圖,它會出現在圖片框中。

繪製按鈕中的點擊事件是鏈接做你的繪圖代碼。第一步是將圖形代碼的調用移至繪圖事件。第二步是用MyPictureBox.Refresh替換所有對繪圖代碼的調用。刷新強制該圖片框的繪畫事件觸發。

您將不得不關注的主要問題是,每次需要刷新表單時,都會觸發paint事件。就像覆蓋它的窗戶被移動一樣。這意味着您的繪圖代碼中的任何速度問題都將被暴露。 AutoRedraw = True將您繪製的內容放入隱藏的位圖中,PictureBox將使用該位圖顯示您繪製的內容。

Paint事件將執行繪圖過程的每一步,因此您必須確保儘可能快。根據您的應用程序的動態變化,更糟糕的放緩問題將會變成現實。如果你正在顯示一個靜態圖像,那麼問題就不會那麼糟糕。

+0

我認爲在你的第二句話中,你的意思是「大多數VB6程序員使用AutoRedraw = * False * not True? – MarkJ 2009-02-02 19:03:23

-1

在窗體代碼窗口中,通常會有一個用於控件的事件下拉框。您需要選擇繪畫事件:

Private Sub object_Paint() 

並填寫您的代碼以在PictureBox上繪圖。

1

使圖片框變小不是一個選項。我很高興「......在Paint事件過程中執行我自己的重繪...」,但我不知道如何去做。有人能告訴我方式嗎?

這很簡單。你只需實現Form或PictureBox的_Paint() - 事件並繪製。

因爲你在問,我想我應該澄清一下AutoRedraw-Propeprty的功能。如果它設置爲true,那麼您可以按照自己想要的方式「繪製圖像」。在多個步驟中。隨你。例如,如果需要重新繪製它,因爲另一個窗口位於頂部,它將被神奇地完成。對於繪圖部分,下部位置很慢。

如果AutoRedraw爲false,則不會發生魔法。 Paint() - 事件將被觸發,您有責任再次繪製圖像。如果你的窗口經常不「失效」(例如「覆蓋」),這將會更快。或者你正在做很多繪畫。

,或者您運行內存,爲「魔力空間」 ;-)

1

如果你不介意重寫你的圖形代碼使用GDI API - 這可能是一個相當艱鉅的任務 - 我發現這thread from 2006 VB6的討論小組,其中Mike Sutton回答說,以一個類似的問題:

VB的後臺緩衝區實現使用 設備相關位圖(DDB)來存儲 的圖像數據,這是相當有限的 它可以製作多大。在舊的 OS'這曾經是~16mb未壓縮的數據大小,在後面的操作系統上,這已經被擴展,但仍然是相當受限制的 。

對此的解決方法是使用一個 設備無關位圖(DIB)和 自己管理GDI資源, 看看在DIB article我 網站如何與他們合作 一個例子。

我還沒有嘗試過自己。