基于C#的ArcEngine二次开发教程19:Addin开发之修改工具栏中的按钮图标

目录

1 几个关键路径

1.1 addin安装路径

1.2 程序启动路径

1.3 图标设置

1.3.1 创建按钮时设置图标

1.3.2 代码修改图标资源

2 修改工具栏的要素图标

2.1 源代码

2.2 示例解释

2.2.1 FaceID属性

2.2.2 图片设置

2.3 函数参数的获取

2.3.1 itemID参数

2.3.2 bmp参数

2.4 代码调用示例

3 [ArcGIS Desktop 遇到严重的应用程序错误] 解决办法

4 一个蹩脚的方案

4.1 方案思路

4.2 方案实施

4.2.1 定义新的重载函数

4.2.2 详细步骤



 

需求说明:我们在制作状态监控的按钮时,总希望通过按钮图标的状态直观的看出当前的工作状态

1 几个关键路径

首先回顾几个关键的路径:

1.1 addin安装路径

在C:\Users\用户名\Documents\ArcGIS\AddIns\Desktop版本号\{…………一组GUID…………}这样的路径下。

 例:C:\Users\Administrator\Documents\ArcGIS\AddIns\Desktop10.1\{0c137a6b-c6ab-4089-838f-17ead1addb66}

1.2 程序启动路径

StartupPath为ArcGis Desktop的安装路径的bin文件夹。

例:C:\Program Files (x86)\ArcGIS\Desktop10.1\bin

1.3 图标设置

1.3.1 创建按钮时设置图标

1.3.2 代码修改图标资源

  • 找到Config.esriaddinx文件,设置图标文件的相对路径

  • 选中设置的图片,将“复制到输出目录”设置为【始终复制】,将“生成操作”设置为【AddInContent

切记:必须执行上述两种操作,不然不会显示,默认显示的是capition的内容

2 修改工具栏的要素图标

2.1 源代码

注意添加引用:

ESRI.ArcGIS.ADF.Local

添加名称空间:

using ESRI.ArcGIS.ADF.COMSupport;

官方示例demo

public void ChangeIcon(IDocument document)
{
    ICommandBars documentBars = document.CommandBars;
    UID barID = new UIDClass();
    barID.Value = "{5DEB1DB8-C2A9-11D1-B9A2-080009EE4E51}";
    ICommandItem standardBarItem = documentBars.Find(barID, false, false);
    //If toolbar is found and is a type of ICommandBar
    if (standardBarItem != null && standardBarItem is ICommandBar)
    {
        ICommandBar standardToolbar = (ICommandBar)standardBarItem;
        UID commandID = new UIDClass();
        commandID.Value = "{81972F0D-388A-11D3-9F57-00C04F6BC61A}";
        ICommandItem contextHelpItem = standardToolbar.Find(commandID, false);
        if (contextHelpItem != null)
        {
            //Get a bitmap first. Here is the embedded resource in the assembly
            System.Drawing.Bitmap newIcon = new System.Drawing.Bitmap(GetType(), "newIcon.bmp");
            contextHelpItem.FaceID = ESRI.ArcGIS.Utility.COMSupport.OLE.GetIPictureDispFromBitmap(newIcon);
        }
    }
}

自己写的例子

        private void setIcon(string itemID, string bmp)
        {
            ESRI.ArcGIS.Framework.ICommandBars commandBars = ArcMap.Application.Document.CommandBars;//获取工具条
            ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass();
            uid.Value = itemID;//设置要更改图标的要素的ID
            ESRI.ArcGIS.Framework.ICommandItem commandItem = commandBars.Find(uid, false, false);//根据ID找到项目
            if (commandItem != null)
            {
                System.Drawing.Bitmap newIcon = new System.Drawing.Bitmap(bmp);//获取bmp格式的图标
                commandItem.FaceID = ESRI.ArcGIS.ADF.COMSupport.OLE.GetIPictureDispFromBitmap(newIcon);//设置项目图标
            }
        }
    }

2.2 示例解释

2.2.1 FaceID属性

FaceID是设置要素图标的属性,该属性仅支持bmp格式图标,内置值为0~48,下为官方解释:

You can also use your own bitmap (.bmp file) with ICommandItem::FaceID. To use your own bitmap, you could create a UserForm in VBA with a Image control on it. Set the Picture property of the Image control to your bitmap.

If you are using your own bitmap, it must be a Bitmap file (.bmp); Icon files (.ico) are not supported. Bitmap files should be 16 X 16 pixels. The color of the upper left pixel of the bitmap is treated as the transparent color. For example, if the upper left pixel of the bitmap is red, then all of the red pixels in the bitmap will be converted to transparent.

意思是:要设置为16*16的bmp格式,不支持ico格式;并且左上角必须是透明,否则会被转换为透明

2.2.2 图片设置

选择图片-->属性-->生成操作:设置为AddInContent

2.3 函数参数的获取

2.3.1 itemID参数

打开Config.esriaddin文件,找到Button的id,也就是图中打码的部分

2.3.2 bmp参数

表示要加载图标的文件名

可在生成的dll文件夹,创建Images文件夹存储,插件要用到的图标

然后传递参数为"Images\myIcon.bmp"

路径务必要正确

2.4 代码调用示例

        bool OpenClose = false;
        protected override void OnClick()
        {           
                if (OpenClose == true)
                {
                   setIcon("ButtonId", @"Images\**.bmp");                    
                   OpenClose = false;
                }
                else
                {
                   setIcon("ButtonId", @"Images\**.bmp");                    
                   EditOpenClose = true;
                }
            }
        }

3 [ArcGIS Desktop 遇到严重的应用程序错误] 解决办法

你也许会遇到调试的时候一切正常,而运行的时候,报如下错误的情形:

这个错误是因为,在你的安装目录下找不到刚才说的Images文件夹,系统因为找不到图标文件所以崩溃;只需将Images文件夹,拷贝到该插件的ID文件夹目录下即可。

文件夹的名字就是你的程序的中的AddInID,如下截图:

4 一个蹩脚的方案

如果上述方法再不行,下面一个蹩脚的方案,还可以试试,也许是个人没有搞明白其中的原理吧,感觉有点绕,所以称之为蹩脚方案。

之所以蹩脚是因为:没找到初始设置图标直接使用资源文件的方法,只能在修改图标的时候使用能够资源图标,这两者不知如何统一起来,统一使用资源图标。

4.1 方案思路

初始图标使用图片文件;之后通过资源文件的方式,进行切换

作业流程:

  1. 初始的图标在你创建按钮的时候,手工选定图标
  2. 切换的时候构建资源文件,从资源文件中选择资源

4.2 方案实施

4.2.1 定义新的重载函数

添加名称空间:

using ESRI.ArcGIS.ADF;

using ESRI.ArcGIS.SystemUI;

using ESRI.ArcGIS.Framework;

 private void setIcon(string itemID, System.Drawing.Bitmap newIcon)
        {
            ESRI.ArcGIS.Framework.ICommandBars commandBars = ArcMap.Application.Document.CommandBars;
            ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass();
            uid.Value = itemID;
           
            ESRI.ArcGIS.Framework.ICommandItem commandItem = commandBars.Find(uid, false, false);
            commandItem.Style = esriCommandStyles.esriCommandStyleIconOnly;
            if (commandItem != null)
            {
            
                //System.Drawing.Bitmap newIcon = Resource1.OpenAutoEdit;
                commandItem.FaceID = ESRI.ArcGIS.ADF.COMSupport.OLE.GetIPictureDispFromBitmap(newIcon);
            }
        }

此时的重载函数的第二个参数为资源文件中的bmp文件

调用方法:

setIcon(按钮ID, 资源名称.图片名);

4.2.2 详细步骤

1. 项目名称,右键--》新建项--》资源文件,设置资源 [名称]

2. 添加资源,选择图像,添加资源

3. 查看资源文件的代码

打开资源文件代码,你可以就看到刚才添加的资源,成为Resource1.Designer.cs文中类Resource1【也就是资源名称】的属性

改编版本重载函数的第二个参数就是从这里来的

4. 打开Resource1.resx,选中你添加的资源图片,将Persistence设置为【嵌入在.resx中】

5. 在需要切换图标处,调用改编之后的函数即可


支持作者,欢迎关注个人公众号:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# SolidWorks二次开发是指使用C#编程语言来扩展和定制SolidWorks软件的功能。下面是进行C# SolidWorks二次开发的步骤: 1. 环境配置: - 首先,确保您已经安装了SolidWorks软件和Visual Studio开发环境。 - 然后,安装SolidWorks API SDK。您可以在SolidWorks安装包找到"SolidWorks API SDK.msi"文件,并按照安装向导进行安装。 2. 创建插件Addin: - 打开Visual Studio,并创建一个新的C#项目。 - 在项目,添加对SolidWorks API的引用。您可以在项目的引用添加SolidWorks.Interop.sldworks和SolidWorks.Interop.swcommands等引用。 - 创建一个类,并实现SolidWorks的事件接口,例如ISwAddin或ISwAddin2。 - 实现所需的功能,例如创建自定义工具栏、菜单或按钮,并实现其相应的事件处理程序。 3. 运行和调试: - 在Visual Studio编译和生成项目。 - 将生成的插件文件(.dll文件)复制到SolidWorks的插件目录,一般为"C:\ProgramData\SolidWorks\SOLIDWORKS 20XX\addins"。 - 启动SolidWorks软件,您应该能够看到您创建的自定义工具栏、菜单或按钮。 - 单击按钮或执行其他操作来测试和调试您的插件功能。 通过以上步骤,您可以开始使用C#编程语言进行SolidWorks的二次开发,实现自定义的功能和工具,以满足您的需求。请确保在开发过程参考官方文档和其他相关教程,以便更好地理解和掌握C# SolidWorks二次开发的技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小薛引路

喜欢的读者,可以打赏鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值