zjh2785 发表于 2018-1-29 23:35:03

【原创】类似天正屏幕菜单效果======开源

本帖最后由 zjh2785 于 2018-12-8 23:01 编辑

有更新版本,请各位移步
【源码】仿天正屏幕菜单(更新)

发个贴吧,顺便等大神回答我刚发的请求贴,闲来没事做了个类似天正的屏幕菜单,类已经封装好了,见附件
使用的时候直接new一个MyPanel就可以用了。
但目前获取资源中的图标还在做,前面做的一个好像在CAD中不能用,注释掉了。

下面是最终效果:



以下是具体步骤,适合新手
========================================
第一步:用Visual Studio新建一个CAD插件(基础的命令创建方法就不阐述了)
第二部:添加自定义控件类到项目中(下面附件有文件)


第三步:文件-添加-新项目,选择VisualC#下的windows,在右侧选择windows 窗体控件库,项目名称为DockDrag
双击控件进入到代码,实例化一个MyPanel ,在Load下直接添加需要加入的命令,

第四步:添加代码



由于自己本人使用,没有写什么注释,看不懂的新手朋友可以发帖提问,我也是新手,我能力范围内的我会经全力解答。下那个部分压缩吧就可以了
=====================================================================
=====================================================================
=====================================================================

有些朋友说东西不全,这样好了,我把所有其他的代码全部提出来,只留下需要用到的,剩下的代码在窗口中使用就行了
顺便把图标处理好了:


使用方法:using System;
using System. Drawing;
using System. Windows. Forms;
using Autodesk. AutoCAD. Windows;
using Autodesk. AutoCAD. ApplicationServices;
using Autodesk. AutoCAD. Runtime;
using Autodesk. AutoCAD. Geometry;
using DotNetARX;
using System. Collections. Generic;
using System. Runtime. InteropServices;

namespace CADToolBox
{
    public partial class DockDrag : UserControl
    {
      //初始化
      SimplePanel sp;
      public DockDrag ( )
      {
            InitializeComponent( );
            sp = new SimplePanel(this, Resource1.PanelDefaultIcon, Resource1.PanelClickedIcon );
            sp. SubButtonClick += new EventHandler(sp_SubButtonClick);
            sp. SubButtonMouseLeave += new EventHandler(sp_SubButtonMouseLeave);
      }

      //因为单击命令后系统焦点在工具条上,
      //所以执行完命令之后鼠标回到CAD绘图区会出现不能响应的现行,
      //因此需要手动把焦点设置到CAD
      
      private static extern bool SetForegroundWindow (IntPtr hWnd);
      private void sp_SubButtonMouseLeave (object sender, EventArgs e)
      {
            SimpleButton btn = sender as SimpleButton;
            if (btn != null)
            {
                Document doc = Autodesk. AutoCAD. ApplicationServices. Application. DocumentManager. MdiActiveDocument;
                SetForegroundWindow(doc. Window. Handle);
            }
      }

      //执行命令
      private void sp_SubButtonClick (object sender, EventArgs e)
      {
            SimpleButton btn = sender as SimpleButton;
            if (btn != null)
            {
                Document doc = Autodesk. AutoCAD. ApplicationServices. Application. DocumentManager. MdiActiveDocument;
                doc. SendStringToExecute(btn.Tag.ToString() + "\n", true, false, true);
            }
      }

      //添加命令
      private void DockDrag_Load (object sender, EventArgs e)
      {
            IntPtr index = sp. AddItem("系统设置");
            sp. AddItem(index, "批量打印", "CNJ_BatchPlot", Resource1.IM_BATCHPLOT);
            sp. AddItem(index, "插参照块", "CNJ_InsertBlocks", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "绘制直线", "Line", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "标高标注", "BG", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "坡度标注", "PD", Resource1. IM_EASYBLOCK);
            index = sp. AddItem("常用命令");
            sp. AddItem(index, "绘等高线", "DGX", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "标等高线", "bdgx", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "超级偏移", "SO", Resource1. IM_EASYBLOCK);
             index = sp. AddItem("系统设置");
            sp. AddItem(index, "批量打印", "CNJ_BatchPlot", Resource1. IM_BATCHPLOT);
            sp. AddItem(index, "插参照块", "CNJ_InsertBlocks", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "绘制直线", "Line", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "标高标注", "BG", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "坡度标注", "PD", Resource1. IM_EASYBLOCK);
            index = sp. AddItem("常用命令");
            sp. AddItem(index, "绘等高线", "DGX", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "标等高线", "bdgx", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "超级偏移", "SO", Resource1. IM_EASYBLOCK);
             index = sp. AddItem("系统设置");
            sp. AddItem(index, "批量打印", "CNJ_BatchPlot", Resource1. IM_BATCHPLOT);
            sp. AddItem(index, "插参照块", "CNJ_InsertBlocks", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "绘制直线", "Line", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "标高标注", "BG", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "坡度标注", "PD", Resource1. IM_EASYBLOCK);
            index = sp. AddItem("常用命令");
            sp. AddItem(index, "绘等高线", "DGX", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "标等高线", "bdgx", Resource1. IM_EASYBLOCK);
            sp. AddItem(index, "超级偏移", "SO", Resource1. IM_EASYBLOCK);
      }
    }
}


=======================================

代码中获取图标的方法我再啰嗦几句, 简单说就是
1在工程中新建一个资源文件,
2把需要加入到资源中的图标全部添加进去(注意,上面所用的全是ICO格式的),系统会自动生成相关的代码
3然后就可以使用Resource1.图标名 来直接访问资源了,

PS.最重要的一点,要把所有资源的 生成操作 选项设置成 嵌入的资源,否则会提示实例为NULL;






zjh2785 发表于 2018-2-4 17:07:39

本帖最后由 zjh2785 于 2018-2-4 17:20 编辑

zixuan203344 发表于 2018-1-30 09:22
建议:多层级菜单用缩进表示层级,或者前面加层级符号的三角形或者加号,当然也可以用颜色区分,不过没缩进 ...
嗯 其实是可以支持你所说的那样的,在MyPanel的构造函数里边已经有了的只需要在资源里边把图片加进去可以的
      
public MyPanel (Control parent)
      {
            this. Parent = parent;
            this. Dock = DockStyle. Fill;
            Items = new List<Item>( );
            m_defaultClickImage = DockDrag. GetSource("CADToolBox.Resources.Icon1.ico");
            m_defaultNoClickImage = DockDrag. GetSource("CADToolBox.Resources.Icon2.ico")
            this. ClientSizeChanged += new EventHandler(this. MyPanel_ClientSizeChanged);
            this. MouseWheel += new MouseEventHandler(this. MyPanel_MouseWheel);
      }

zjh2785 发表于 2018-4-20 01:34:14

j15tty 发表于 2018-4-19 22:11
楼主,测试后发现面板不能移动,也没有关闭按钮,这个该如何修改

你是不是设置的问题,面板的风格有下面这些,
public enum PaletteSetStyles
    {
      ShowAutoHideButton = 2,
      ShowPropertiesMenu = 4,
      ShowCloseButton = 8,//显示关闭按钮
      NameEditable = 16,
      Snappable = 32,
      ShowTabForSingle = 64,
      UsePaletteNameAsTitleForSingle = 128,
      SingleRowDock = 512,
      Notify = 1024,
      SingleRowNoVertResize = 2048,
      SingleColDock = 4096,
    }

zjh2785 发表于 2018-4-23 13:27:18

本帖最后由 zjh2785 于 2018-4-23 13:30 编辑

j15tty 发表于 2018-4-21 12:14
是我CAD 是精简版缘故。还有请问一下,如果要做成像26楼那样将tab放置在左边,需要怎么设置?
如果要直接拿我的那个代码该,该动量很大,虽然原理都一样,但这完全是两回事。动态在左侧增加按钮,根据按钮数量确定按钮的位置,然后为添加事件、关联数据。个人看法
不是设置的问题

zixuan203344 发表于 2018-1-30 09:22:30

建议:多层级菜单用缩进表示层级,或者前面加层级符号的三角形或者加号,当然也可以用颜色区分,不过没缩进看着直观

pengfei2010 发表于 2018-1-30 20:35:08

不错不错,但好像少了点什么啊,没有子菜单吗

土土木木人 发表于 2018-1-30 20:58:02


不错不错   

腾龙 发表于 2018-1-31 22:18:45

想知道你用的VS是那一版的, 我安装了VS2017不支持CAD2010~2018开发工具包

clinber 发表于 2018-2-1 22:48:19

却很多内容啊

zjh2785 发表于 2018-2-4 17:17:18

腾龙 发表于 2018-1-31 22:18
想知道你用的VS是那一版的, 我安装了VS2017不支持CAD2010~2018开发工具包

我用的是2010

langzhi 发表于 2018-2-7 08:51:51

谢谢大神分享。

dong20030432 发表于 2018-2-9 12:17:00

不知道有没有哪个大神知道如何使用VBA直接实现屏幕菜单的效果?
页: [1] 2 3 4 5 6
查看完整版本: 【原创】类似天正屏幕菜单效果======开源