獲取ArcMap窗口句柄,通過WinAPI獲取工作空間中點擊要素的系統桌面坐標實現窗體跟隨


這里用了個“桌面坐標”,是希望區分一下ArcGis的“屏幕坐標”(與之對應的還有一個“地理坐標”)。

什么是“屏幕坐標”呢?使用ITool接口的OnMouseDown方法獲取的“x,y”值即是,其原點值在“工作空間”窗體左上角。

什么是我所稱謂的“工作空間”呢?它是數據編輯區域,用Spy++查看一下其窗體的classname是“AfxFrameOrView90u”,這樣看稱作“工作框”或者“工作視圖”什么的似乎更准確~

前面已經提到可以通過OnMouseDown方法獲取鼠標在AfxFrameOrView90u窗口相對於其左上角的坐標值(鼠標點擊位置的“屏幕坐標”),而通過IActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint()可以將地理坐標轉為屏幕坐標,那么獲取AfxFrameOrView90u窗口左上角的系統桌面坐標加上“屏幕坐標值”就可以獲取鼠標點擊位置或者工作框中要素的桌面坐標。

知道桌面坐標就可以做一些窗體跟隨,桌面繪圖等的效果了。

使用GetClassName通過句柄獲取當前ArcMap窗口的ClassName,然后查找子窗口獲得AfxFrameOrView90u就可以下一步操作了,主要代碼如下:
API部分:

 class WinAPI { [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll", EntryPoint = "FindWindow")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr Hwnd, ref RECT lpRect);//獲取window的矩形坐標 } [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; }

窗體跟隨鼠標,可以實現通過對窗體選項內容的點選等操作,將信息寫入當前選中的要素,節省人工屬性表輸入。
也可以實現輔助編號的操作,參考ArcGis輔助編號(半自動)功能的插件式實現



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM