2009-04-07 62 views
2

我正在使用C#GDI +創建自定義控件。GDI +離屏緩衝滾動

快速的解釋...的控制將是說在屏幕上500個像素,但會包含或許500000信息的像素。所以,雖然我只顯示500px,但我需要明顯地在水平面上滾動(左側&右側)。棘手的部分是每個500px的位圖塊需要一段時間(在100ms到1000ms之間)才能渲染。

所以我的計劃是保持在內存中1500px位圖。即可見區域的500px可見部分和500px任一側,並且在用戶滾動時異步地繪製離屏部分。

我想一些反饋,建議,批評和代碼示例來幫助我實現這一目標。這似乎相當簡單,但經過一些初步測試之後,其證明比人們想象的要難得多。

謝謝。

+0

您遇到什麼樣的問題?閃爍?你是否已經渲染了一個緩衝區,然後從緩衝區複製到你的繪製事件中的控件中? – overslacked 2009-04-07 19:57:40

+0

是的,我目前能夠建立一個1500px的位圖並滾動這個。我遇到的問題確實是在用戶滾動到緩衝區邊緣時更新位圖的最佳方法。 – pmcilreavy 2009-04-07 21:07:06

+0

我在想一種方法是根據需要滾動和更新三個500px位圖。 – pmcilreavy 2009-04-07 21:07:45

回答

1

這種方法的有效性取決於,除其他事項外,各地的用戶會做移動的量。如果用戶正在做小動作,然後停下來考慮新的信息,這可能會起作用。但是,如果用戶來回傳遞,則仍然存在問題。

您的應用程序借給本身逐步提高圖像的質量 - 即提供一個快速的可用圖像,然後爲用戶停止考慮它改善了嗎?

1

幾年前,我有類似的問題。正如dommer提到的,如果你在顯示圖像之前處理圖像塊,你最好展示一些東西並在以後改進它。如果您在原始圖像上遇到問題,您的方法有問題。 GDI +對像素深度非常特別(你需要32位Alpha)。

在我們的案例中,我們處理了500px的瓷磚,並在可見視圖周圍填充了一塊瓷磚。如果用戶在我們處理的區域外滾動,我們用一個深色半透明矩形超級施加在他們。這些塊已排隊等待處理。當我們處理圖像的塊(中心)時,他們半透明的矩形會消失。

它工作得很好,響應速度非常快。將原始位圖粘貼到屏幕上非常快,在我們的情況下,處理通常非常緊密。瓷磚變得更輕的效果實際上非常漂亮。

1

只繪製可見區域。 構建方法

Bitmap DrawGraph(leftMargin, rightMargin) {...} 

,然後在OnPaint()

Bitmap bmp = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height); 
bmp = DrawGraph(e.ClipRectangle.Left, e.ClipRectangle.Right); 

e.Graphics.DrawImageUnscaled(bmp, e.ClipRectangle.Location);