SuperMap桌面软件中的精确十分诱人,但如何在二次开发中实现同样的效果呢?小测试了一下,发现效果不错,分享一下.
功能实现的两个主要事件为地图的MouseMoveEvent和文本框的文本值确定事件(测试采用当Y值文本框输入ENTER键时表示确定此点输入,当然这个事件可任意更改).
当鼠标在地图窗口移动时,确定X和Y坐标的文本框显示当前鼠标位置(事先将地图的操作设为画折线)。
if (axSuperMap1.Action == seAction.scaEditCreatePolyline)
{
double dX = axSuperMap1.PixelToMapX(e.x);
double dY = axSuperMap1.PixelToMapY(e.y);
txtX.Text = dX.ToString();
txtY.Text = dY.ToString();
txtX.SetBounds(e.x, e.y, 75, 21);
txtY.SetBounds(e.x, e.y + 22, 75, 21);
txtX.Visible = true;
txtY.Visible = true;
txtX.Focus(); //此处主要为方便更改X坐标值,输入ENTER或TAB键后txtY获得焦点,对txtY输入TAB键后txtX获得焦点,方便交互更改,代码没列出,这个切换应该是个小CASE。
txtX.SelectAll();
}
当对txtY文本框输入ENTER键时,默认为X、Y坐标都已确认。
private void txtY_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode ==Keys.Enter )
{
soPoint objPt = new soPointClass();
objPt.x = double.Parse(txtX.Text);
objPt.y = double.Parse(txtY.Text);
axSuperMap1.AddTrackingPoint(objPt); //此句为程序精华所在,SuperMap此方法只在交互式编辑时起到相应效果,若地图操作不处于交互式编辑状态,此行代码执行后地图上不会有任何反应。此得执行后即在地图上添加了一个折线上的点。
axSuperMap1.Refresh();
Marshal.ReleaseComObject(objPt);
objPt = null;
}
}