這里用了個“桌面坐標”,是希望區分一下ArcGis的“屏幕坐標”(與之對應的還有一個“地理坐標”)。
什么是“屏幕坐標”呢?使用ITool接口的OnMouseDown方法獲取的“x,y”值即是,其原點值在“工作空間”窗體左上角。
什么是我所稱謂的“工作空間”呢?它是數據編輯區域,用Spy++查看一下其窗體的classname是“AfxFrameOrView90u”,這樣看稱作“工作框”或者“工作視圖”什么的似乎更准確~
前面已經提到可以通過OnMouseDown方法獲取鼠標在AfxFrameOrView90u窗口相對於其左上角的坐標值(鼠標點擊位置的“屏幕坐標”),而通過IActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint()可以將地理坐標轉為屏幕坐標,那么獲取AfxFrameOrView90u窗口左上角的系統桌面坐標加上“屏幕坐標值”就可以獲取鼠標點擊位置或者工作框中要素的桌面坐標。
知道桌面坐標就可以做一些窗體跟隨,桌面繪圖等的效果了。
使用GetClassName通過句柄獲取當前ArcMap窗口的ClassName,然后查找子窗口獲得AfxFrameOrView90u就可以下一步操作了,主要代碼如下:
API部分: