• 如何在ArcMap中监听键盘鼠标事件(转)


    如何在ArcMap中监听键盘鼠标事件()

    Link: http://www.cnblogs.com/dyllove98/p/3155551.html

    昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段。

    单就这个功能而言,可能不一定非得开发,或许直接在属性表里批量编辑也是个办法。但如果实现了这个功能,还可以引申出一些其他的应用,比如在要素编辑的时候自动进行质量检查;比如在地图浏览中添加许多预定义的效果等。

    闲话不说,先介绍一下实现思路:ArcMap中本身是无法让你监听键盘事件的,显然需要通过开发。开发的途径,目前主要是通过Add-In。在Add-In中,我们需要写一个工具,由工具来实现对鼠标和键盘事件的监听。

    详细理一下步骤:

    1.开发一个Add-In插件;

    2.Add-In插件中,写一个工具;

    3.Add-In部署到ArcMap中;

    4.用户点击Add-In插件的时候,代码里初始化工具,将其设置为地图的当前活动工具;

    5.在工具类中,监听鼠标和键盘事件,执行所需的操作。

    想必大家看了这几个步骤之后,觉得也没什么难度,事实上也如此,唯一需要注意的就是工具需要实现的接口,以及如何在Add-In里面初始化和调用工具。

    下面是示例代码。

    首先定义工具:

       

    class HotKeyTool:ITool,ICommand,ICommandItem


    注意该工具实现了ITool,ICommand,ICommandItem接口,其中IToolOnKeyDown方法、OnMouseDown等方法,就是你的业务逻辑代码应该放的地方:

       

       

    //响应按键按下事件

    public void OnKeyDown(int keyCode, int shift)

    {

    Keys key = (Keys)keyCode;

    switch (key)

    {

    case Keys.B:

    MessageBox.Show("S pressed");

    break;

    case Keys.C:

    MessageBox.Show("D pressed");

    break;

    case Keys.A:

    MessageBox.Show("A pressed");

    break;

    default:

    MessageBox.Show(key + " pressed~");

    break;

    }

    }

       

    ICommandItemUID属性,则是非常关键的一个属性,需要生成一个UID值并返回。

       

    //此属性会被反复多次调用

    private UID uid = null;

    public ESRI.ArcGIS.esriSystem.UID ID

    {

    get

    {

    if (uid == null)

    {

    uid = new UIDClass();

    uid.Value = "{6B76685B-31C5-4B69-8AC3-B6E9FE16D162}";

    }

     

    return uid;

    }

    }

       

    工具类其它代码没有特别需要说明的,接下来看下如何初始化和调用工具:

       

    protected override void OnClick()

    {

    ArcMap.Application.CurrentTool = null;

     

    IMxDocument mxDoc = ArcMap.Document;

    IActiveView activeView = mxDoc.ActiveView;

    IMap map = activeView.FocusMap;

     

    //初始化工具,并将其与应用程序绑定

    HotKeyTool hotKeyTool = new HotKeyTool();

    hotKeyTool.App = ArcMap.Application;

     

    try

    {

    ICommandItem cmdItem = hotKeyTool as ICommandItem;

     

    //设置当前工具,以便处理键盘事件

    ArcMap.Application.CurrentTool = cmdItem;

    }

    catch (Exception ex)

    {

     

    }

     

    }

  • 相关阅读:
    Go-闭包
    GO-数组与切片
    Go-包
    Go-for循环
    GO-逻辑判断(if,else if,else,switch)
    前后端分离的思考与实践(六)
    前后端分离的思考与实践(五)
    前后端分离的思考与实践(三)
    前后端分离的思考与实践(二)
    前后端分离的思考与实践(一)
  • 原文地址:https://www.cnblogs.com/xiexiaokui/p/4091269.html
Copyright © 2020-2023  润新知