您的位置:首页 > 编程语言 > C#

基于插件技术的GIS应用框架(C# + ArcEngine9.3)(十)

2010-08-04 09:22 531 查看
基于插件技术的GIS应用框架(C# + ArcEngine9.3)(十)
---------------------------ITool的上下文菜单
大家也许没有发现,在直接将esriControls中的工具集成到自己的框架里的时候,OnContextMenu事件却无法得到处理,造成了工具没有上下文菜单,其实这也不能怪ESRI,因为当你讲MapControl或PageLayoutControl的CurrentTool设置为某个具体的esriControls中的工具,如:ControlsMapPanTool时,MapControl是不会为你调用OnContextMenu方法的,这个时候如果用户同样想拥有工具的上下文菜单时,怎么办呢?在本文论述的框架中作了如下的处理,当然可能的方法有很多种,在这里只是提供了一个参考。
下面以地图平移工具为例,来说明这个问题。
public class Pan : IAxTool, esriSystemUI.ICommand, esriSystemUI.ITool
{
private IAxApplication _App;
private esriSystemUI.ITool _tool = null;
private esriSystemUI.ICommand _cmd = null;
private System.IntPtr _Handle;
private System.Drawing.Icon _Icon;
public Pan()
{
System.Resources.ResourceManager manager = new System.Resources.ResourceManager("AxeMap.MapView.icon", System.Reflection.Assembly.GetExecutingAssembly());
object target = manager.GetObject("Pan");
_Icon = (System.Drawing.Icon)target;
_Handle = _Icon.Handle;
}
#region IAxTool 成员
public int Bitmap
{
get { return _Handle.ToInt32(); }
}
public string Caption
{
get { return "平移"; }
}
public string Category
{
get { return "地图"; }
}
public bool Checked
{
get { return false; }
}
public int Cursor
{
get
{
if (_tool != null)
{
return _tool.Cursor;
}
else
{
return (int)esriControls.esriControlsMousePointer.esriPointerPan;
}
}
}
public bool Deactivate()
{
return true;
}
public bool Enabled
{
get { return _App.FocusMap != null; }
}
public int HelpContextID
{
get { return 0; }
}
public string HelpFile
{
get { return ""; }
}
public string Message
{
get { return "平移"; }
}
public string Name
{
get { return "Pan"; }
}
public IPoint SnappedPoint
{
get { return null; }
}
public void OnClick()
{
_cmd = new ControlsMapPanToolClass() as ICommand;
if (_App.ActiveView is IMap)
{
_cmd.OnCreate(this._App.MapControl);
}
else if (_App.ActiveView is IPageLayout)
{
_cmd.OnCreate(this._App.PageLayoutControl);
}
_tool = _cmd as esriSystemUI.ITool;
//_App.CurrentTool = _tool; //如果没有上下文菜单就写上这句,如果有 就不要写否则 OnContextMenu 不会执行
}

public bool OnContextMenu(int x, int y)
{
//在这里创建你的弹出菜单,框架应用程序根据当前工具的情况进行调用,以显示工具的弹出菜单;
}
//这里,我们将演示如何从框架插件池中已有的命令去创建工具的上下文菜单
//_CommonToolPopupMenu 为 devExpress 套件中的弹出菜单
public void ShowToolPopupMenu(System.Drawing.Point p)
{
if (_CommonToolPopupMenu != null)
{
_CommonToolPopupMenu.Manager = MainForm.barManager;
_CommonToolPopupMenu.Popup += PopupMenuOnPopup;
if (_CommonToolPopupMenu.ItemLinks.Count <= 0)
{
_CommonToolPopupMenu.ItemLinks.Clear();
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("全图", "AxeMap.MapView.FullExtent"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("返回前一视图", "AxeMap.MapView.ZoomMapToLastExtentBack"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("进入下一视图", "AxeMap.MapView.ZoomMapToLastExtentForward"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("定比放大", "AxeMap.MapView.ZoomInFixed"));
_CommonToolPopupMenu.ItemLinks[_CommonToolPopupMenu.ItemLinks.Count - 1].BeginGroup = true;
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("定比缩小", "AxeMap.MapView.ZoomOutFixed"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("中心定位", "AxeMap.MapView.GoMapCenter"));
_CommonToolPopupMenu.ItemLinks[_CommonToolPopupMenu.ItemLinks.Count - 1].BeginGroup = true;
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("选择要素", "AxeMap.Selection.SelectTool"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("识别", "AxeMap.Generic.Identify"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("缩放到选择集", "AxeMap.Selection.ZoomToSelection"));
_CommonToolPopupMenu.ItemLinks[_CommonToolPopupMenu.ItemLinks.Count - 1].BeginGroup = true;
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("清除地图选择集", "AxeMap.Selection.ClearMapSelection"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("粘贴", "AxeMap.MapEdit.Paste"));
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("标注", "AxeMap.Layer.LabelLayer"));
_CommonToolPopupMenu.ItemLinks[_CommonToolPopupMenu.ItemLinks.Count - 1].BeginGroup = true;
_CommonToolPopupMenu.AddItem(CreateCustomMenuItem("数据框架属性...", "AxeMap.Layer.DataFrameProperty"));
_CommonToolPopupMenu.ItemLinks[_CommonToolPopupMenu.ItemLinks.Count - 1].BeginGroup = true;

}
_CommonToolPopupMenu.ShowPopup(p);
}
}

private DevExpress.XtraBars.BarButtonItem CreateCustomMenuItem(string caption, string cmdnamespace)
{
DevExpress.XtraBars.BarButtonItem item = null;
IAxCommand axcmd;
IAxTool axtool;
ICommand cmd = null;
item = new DevExpress.XtraBars.BarButtonItem(); // (Application, pCommand);
item.Tag = cmdnamespace;
item.Caption = caption;
axcmd = _App.FindCommandByNameSpace(cmdnamespace); //cmdnamespace 为命令的命名空间
if (axcmd == null)
{
axtool = _App.FindToolByNameSpace(cmdnamespace);
if (axtool != null)
{
cmd = axtool as ICommand;
}
}
else
{
cmd = axcmd as ICommand;
}
if (cmd != null)
{
try
{
item.Enabled = cmd.Enabled;
item.Down = cmd.Checked;
item.Hint = cmd.Tooltip;
item.Caption = cmd.Caption; //如果命令存在,则还是采用命令本身的Caption
//加载命令或工具的图标或位图
System.IntPtr _Handle = (System.IntPtr)(cmd as ICommand).Bitmap;
if (_Handle.ToInt32() != 0)
{
try
{
item.Glyph = System.Drawing.Bitmap.FromHicon((System.IntPtr)(cmd as ICommand).Bitmap);
}
catch
{
try
{
item.Glyph = System.Drawing.Image.FromHbitmap(_Handle);
}
catch
{
}
}
}
//连接OnClick
item.ItemClick += Item_OnClick;
}
catch
{
item.Enabled = false;
}
}
else
{
item.Enabled = false;
}
return item;
}
private void Item_OnClick(object sender, ItemClickEventArgs e)
{
if (e.Item is BarButtonItem)
{
BarButtonItem item = (BarButtonItem)e.Item;
ICommand cmd = _App.FindCommandByNameSpace(item.Tag.ToString()) as ICommand;
if (cmd != null)
{
cmd.OnClick();
}
else
{
ITool tool = _App.FindToolByNameSpace(item.Tag.ToString()) as ITool;
if (tool != null)
{
(tool as ICommand).OnClick();
}
}
}
}
public void OnCreate(object hook)
{
if (hook != null)
{
if (hook is IAxApplication)
{
this._App = hook as IAxApplication;
}
}
}
public void OnDblClick()
{
if (_tool != null)
{
_tool.OnDblClick();
}
}
public void OnKeyDown(int keyCode, int shift)
{
if (_tool != null)
{
_tool.OnKeyDown(keyCode, shift);
}
}
public void OnKeyUp(int keyCode, int shift)
{
if (_tool != null)
{
_tool.OnKeyUp(keyCode, shift);
}
}
public void OnMouseDown(int button, int shift, int x, int y)
{
if (_tool != null)
{
_tool.OnMouseDown(button, shift, x, y);
}
}
public void OnMouseMove(int button, int shift, int x, int y)
{
if (_tool != null)
{
_tool.OnMouseMove(button, shift, x, y);
}
}
public void OnMouseUp(int button, int shift, int x, int y)
{
if (_tool != null)
{
_tool.OnMouseUp(button, shift, x, y);
}
}
public void Refresh(int hDC)
{
if (_tool != null)
{
_tool.Refresh(hDC);
}
}
public string Tooltip
{
get { return "平移"; }
}
#endregion
}
在上面地图平移工具的红色代码中,我们创建了这个工具的右键弹出菜单,但是,框架程序怎么调用呢?代码如下:
private void axMapControl_OnMouseDown(object sender, AxesriControls.IMapControlEvents2_OnMouseDownEvent e)
{
DevExpress.XtraBars.PopupMenu ppm;
bool bHandled;
System.Drawing.Point p = new System.Drawing.Point();
p = System.Windows.Forms.Control.MousePosition;
if (e.button == 2)
{
if (_App.CurrentTool == null)
{
_App.ShowCommonToolPopupMenu(p);
return;
}
else
{
bHandled = (_App.CurrentTool as ITool).OnContextMenu(e.x, e.y);
if (bHandled)
{
return;
}
}
}
}
通过(_App.CurrentTool as ITool).OnContextMenu(e.x, e.y); 这句代码来调用当前工具的上下文菜单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: