2011-11-24 151 views
1

我需要在C#WinForms中繪製一個大型的交互式樹形結構 - 一個公司層次結構。C#交互式繪圖#

除了將排列在樹上的塊可能會非常複雜的算法之外,我並不確定如何去實現實際的畫布和繪製代碼。乍一看,我可以創建一個巨大的圖像(或一個大圖像矩陣),並使用一個GraphicsBufferedGraphics來呈現給定用戶放大的一個小區域。這會給縮放平移您可能會在Google地圖上看到的效果。

至於交互性,這裏可以做些什麼?我希望用戶能夠強調某些人(特定成本中心的人員,承包商的人等)。而且,如果隨着用戶放大,樹顯示更多有關員工的信息,這將非常酷。我是否應該用MouseMove事件進行命中測試,並以編程方式添加/刪除/更改構成畫布上圖片的內容?

這是我應該避免使用GDI,也許使用DirectDraw來代替嗎?我不想過度使用 - 我只是想能夠直觀地呈現結構並讓用戶選擇打印它。

另外,是否有一個(免費軟件?)庫可用,允許縮放和平移與交互?我可能會問一些,但也許也可以處理樹結構?

我對小規模的每個個體概念都有經驗,但沒有一個像這樣的大型結構聚集在一起。我預測如果我做錯了什麼,它會變成非常緩慢,緩慢和記憶困難的事情。

我只涉獵了WPF。我幾乎完全在.Net中使用WinForms - WPF中有什麼可以使這個任務變得更容易?

回答

1

我不知道這甚至是答案,但我做了很多使用GDI +的交互式圖形工作,我覺得我可以非常有效地使用它。無論是樹形結構,還是多功能佈局編輯器,以及瀏覽照片等,都可以使用樹結構。

什麼不是想要在大位圖上繪製所有內容。避免大的位圖。 :-)

所以要麼你使用框架提供的雙緩衝圖形,要麼你自己設計它。如果你想遠程運行你的應用程序,這可能不是完美的,但是:http://blogs.msdn.com/b/oldnewthing/archive/2006/01/03/508694.aspx

基本上你只要把你想在一個列表得出,並與inforamtion更新它究竟是在哪裏它結束了,你在屏幕上的一切,讓你可以在OnMouseDown/OnMouseMove/OnMouseUp中對它進行命中測試。你會很快注意到需要保持一個枚舉的交互所在的狀態(eg.g DraggingObject,MakingSelection,Scrolling等)和Point_lastMousePosition。

邏輯非常簡單。使其無閃爍且響應可能不是簡單。

+0

就像我說過的,我對每一個人的概念都很熟悉和實踐,但從來沒有把它整合到一個像這樣的大型互動展示中。我可以向你保證,你的建議當然有幫助!謝謝。 – user1002358

+0

很高興能幫到你! :-) –

1

假設你在使用WinForms,一個選項是爲每個需要公開交互的項目創建自己的自定義控件。

然後創建另一個自定義控件來容納它們和主畫布。給它一個畫布(例如面板)和幾個滾動條。

使用滾動條時,根據需要動態創建和刪除子控件。超過一定的縮放級別時,您可能需要從控件切換到直接繪製的非交互式圖像。

此模型假定用戶一次不會與多個控件進行交互。如果你提供一個套索,讓他們選擇多個項目,事情會變得很難。

+0

P.S.祝你好運。你想要什麼是可能的,但這並不容易。 –