2011-09-20 70 views
0

我已經作出了程序,讀取從XML文件中的一些二極管曲線的電壓和電流值,並繪製他們在屏幕上(只是使用普通2D圖形和一些簡單的命令,如DrawCurve和東西像那樣)。交互式放大到C#中的2D圖形位圖

我主畫面爲800×800像素(下面你可以看到下一個較小的屏幕截圖)。現在我想添加一個縮放功能,當我將鼠標懸停在這個圖像區域上時,當我將鼠標移動到這個區域時,會彈出一個飛行的小方塊並放大+移動。

我不知道如何解決這個問題。當然,我不要求完整的工作代碼,但請幫助我接近!

舉例來說,我可以讓變焦的工作,不讀取曲線數據和繪畫實時?或者它沒有逃脫?當我將鼠標移動到原始圖像上時,如何獲得懸停圖像框?

謝謝!

enter image description here

回答

2

你有沒有定時DrawCurve需要多長時間?也許它足夠快,可以實時進行。不要忘記,GDI會將繪圖原語剪切到繪圖區域。您只需在您移動鼠標時設置剪切矩形。

爲了加速重繪,創建主窗口圖像(您粘貼的那個)作爲離屏位圖,並在屏幕上顯示屏幕上的屏幕版本。這樣你可以減少DrawCurve的影響。

最後,爲了獲得好看的結果,重載OnPaintBackground(記不清名字,但是它是這樣的),所以它什麼都不做(甚至不用調用基類)並在OnPaint方法中執行所有的繪製使用一個BufferedGraphics對象。

更新

你的油漆的功能可能是這樣的:

OnPaint (...) 
{ 
    the_graphics_object.DrawImage (the background image); 
    the_graphics_object.Clip = new Region (new Rectangle (coords relative to mouse position)); 
    the_graphics_object.TranslateTransform (drawing offset based on mouse position); 
    RenderScene (the_graphics_object, scale_factor); // draws grid and curve, etc 
    the_graphics_object.DrawRectangle (zoom view rectangle); // draw a frame around the zoomed view 
} 

這將產生相對於鼠標位置的浮動「窗口」。

+0

嗯,我認爲它繪製te曲線相當快(我粗略猜測大約10毫秒)。你能解釋更多關於使用鼠標懸停剪輯的事件嗎? –

+1

@ Sean87:查看更新的答案。當鼠標移動並且縮放功能啓用時,重新繪製窗口。 – Skizz

2

通常,當重繪可能很耗時的情況下,變焦通常是通過提供「快速,但醜」的實施,旁邊的「正確的,但慢」的實施解決。當縮放操作正在進行中時(例如,當用戶點擊滑塊時,或直到距上一次縮放值更改發生後的50ms),則使用快速和醜陋模式,以便用戶可以看到最終的形象是什麼。一旦他們放開縮放滑塊(或您提供的任何機制),您可以重新計算圖像的細節。快速版本通常根據您正在使用的原始圖像進行計算。

在你的情況,你可以簡單地把原始圖像,制定出新的,放大圖像的邊框,並縮放原始圖像的相關部分到滿圖像大小。如果說100毫秒已經過去,沒有變焦,請重新計算整個圖像。

這種功能的例子非常普遍:大多數分形生成器完全使用這種技術,甚至與谷歌StreetView無關的東西(它提供了一個非常醜陋的前一張圖片,當你移動時,直到實際圖像已下載)。