在ArcEngine中使用INewLineFeedback實現 距離測量(面積測量)的正確方法

    客戶最近打電話過來,說我們的軟件在量距離的時候不能平移地圖。我們的軟件是使用ArcEngine來開發的,在網上輸入關鍵字“arcengine 距離測量”,可以搜索到一大堆內容基本相似的文章或代碼,基本上都是採用INewLineFeedback來實現的,我們的軟件也是使用此種方法。方法大致如下:寫一個距離測量工具,繼承自BaseTool,在該類中使用INewLineFeedback動態繪製多段折線,最後轉化爲Element添加到地圖上。如果要增加平移功能,我們仿造ArcMap使用鼠標中鍵平移,在OnMouseDown、OnMouseMove、OnMouseUp事件中增加判斷鼠標中鍵的語句,然後分別使用PanStart、PanMoveTo、PanStop實現地圖的平移。

    此時,出現了一個新問題,一旦移動地圖後,之前使用INewLineFeedback繪製的線完全亂了方寸,有一部分線丟失了。之後又發現一個更可笑的問題,在繪製的過程中,如果使用alt+tab鍵切換到其它窗口,然後再切換回地圖窗口的時候,會多出一條線,INewLineFeedback把切換窗口前的鼠標位置記錄了下來。

    對於這個問題,我使用ArcMap的測量工具檢查了一下,發現不存在上述問題。但是INewLineFeedback爲什麼會產生這個bug,難道是本人的使用方法不對。在網上搜了一下其他類似代碼進行測試,都存在這個bug。ArcEngine的SDK文檔上也沒有特別強調INewLineFeedback的使用細節。

    本來打算用gdi進行解決,最後發現INewLineFeedback有一個Refresh函數,那麼應該在什麼地方使用它呢?在ArcMapControl的諸多事件中,嘗試了OnAfterDraw、OnAfterScreenDraw、OnViewRefresh等,發現OnAfterScreenDraw是OK的。具體是在OnAfterScreenDraw事件中使用Refresh函數刷新INewLineFeedback,完美解決問題。

    相關代碼已放在本人的csdn資源中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章