关于AE中自定义工具栏按钮(C#)



设置按钮的图标,需要动态加载一张图片,程序如下:base.m_bitmap = new System.Drawing.Bitmap            (GetType().Assembly.GetManifestResourceStream(GetType(), "zoomout.bmp"));

// 这行语句的意思是让程序从程序集清单中加载zoomout.bmp图片,其中Assembly可以理解为当前的工程所在的命名空间,GetType()我还不是很清楚,反正用toString()输出后就是你自定义按钮的类所在的路径

但 是调试时总会抛出异常“未处理的“System.ArgumentException”类型的异常出现在 system.drawing.dll 中。其他信息: “null”不是“stream”的有效值。”,显然GetTyp().Assembly.GetManifestResourceStream()方法 并没有找到需要加载的图片。查 了一下资料,发现有人提到Build Action" property should be set to " Embedded Resourse",并且Assembly.GetManifestResourceStream 是从当前程序集加载指定的清单资源,直接将图片加载到当前工程中是不能被加载的。应设置图片的属性为:生成操作-->嵌入的资源即可,还有一点就是,图片必须和你新建的按钮类在同一个命名空间中,否则这种方法加载不了,但可以用

Assembly asm = Assembly.GetExecutingAssembly();

Image image = new Bitmap(asm.GetManifestResourceStream(asm.GetName().Name + "." +mapname));类似的方法加载

 剩下就没有别的了

以下是自定义放大工具

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using System.Drawing;

namespace 自定义工具程序
{
    public sealed class ZoomOut : BaseTool
    {
        IMapControl3 mapControl;
        private IHookHelper m_HookHelper = new HookHelperClass();
        public ZoomOut()
        {
            //Set command properties
            base.m_caption = "Zoom Out";
            base.m_toolTip = "Zoom Out";
            base.m_message = "Zoom Out on the Display";
            base.m_name = "Generic_ZoomOut";
            base.m_bitmap = new System.Drawing.Bitmap
            (GetType().Assembly.GetManifestResourceStream(GetType(), "zoomout.bmp"));
                    
        }
        public override void OnCreate(object hook)
        {
            m_HookHelper.Hook = hook;
            if (hook is IToolbarControl)
            {
                IToolbarControl toolbarControl = (IToolbarControl)hook;
                mapControl = (IMapControl3)toolbarControl.Buddy;
            }
        }

        public override bool Enabled
        {
            get
            {
                if (m_HookHelper.FocusMap == null) return false;
                return true;
            }
        }
        public override void OnMouseDown(int Button, int Shift, int X, int Y)
        {
            //Track a rectangle on the active view
            IEnvelope trackExtent = mapControl.TrackRectangle();
            if (trackExtent == null) return;
            //Get the current extent of the active view
            IEnvelope currentExtent = mapControl.Extent;
            IEnvelope newExtent = null;
            //If the tracked envelope is empty
            if (trackExtent.IsEmpty)
            {
                //Expand the current extent
                newExtent = currentExtent;
                newExtent.Expand(2.0, 2.0, true);
                newExtent.CenterAt(mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y));
            }
            else
            {
                //Create coordinates for the new extent
                double dWidth = currentExtent.Width * (currentExtent.Width /
                trackExtent.Width);
                double dHeight = currentExtent.Height * (currentExtent.Height /
                trackExtent.Height);
                double dXmin = currentExtent.XMin - ((trackExtent.XMin -
                currentExtent.XMin) * (currentExtent.Width / trackExtent.Width));
                double dYmin = currentExtent.YMin - ((trackExtent.YMin -
                currentExtent.YMin) * (currentExtent.Height / trackExtent.Height));
                double dXmax = (currentExtent.XMin - ((trackExtent.XMin -
                currentExtent.XMin) * (currentExtent.Width / trackExtent.Width))) + dWidth;
                double dYmax = (currentExtent.YMin - ((trackExtent.YMin -
                currentExtent.YMin) * (currentExtent.Height / trackExtent.Height))) + dHeight;
                //Set the extent coordinates
                newExtent = new EnvelopeClass();
                newExtent.PutCoords(dXmin, dYmin, dXmax, dYmax);
            }
            //Set the new extent
            mapControl.Extent = newExtent;
        }
    }
}
posted @ 2010-10-04 14:58  f_l_y  阅读(1659)  评论(0编辑  收藏  举报