明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 24378|回复: 57

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

    [复制链接]
发表于 2018-1-29 23:35:03 | 显示全部楼层 |阅读模式
本帖最后由 zjh2785 于 2018-12-8 23:01 编辑

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

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

下面是最终效果:



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


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

第四步:添加代码



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

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


使用方法:
  1. using System;
  2. using System. Drawing;
  3. using System. Windows. Forms;
  4. using Autodesk. AutoCAD. Windows;
  5. using Autodesk. AutoCAD. ApplicationServices;
  6. using Autodesk. AutoCAD. Runtime;
  7. using Autodesk. AutoCAD. Geometry;
  8. using DotNetARX;
  9. using System. Collections. Generic;
  10. using System. Runtime. InteropServices;

  11. namespace CADToolBox
  12. {
  13.     public partial class DockDrag : UserControl
  14.     {
  15.         //初始化
  16.         SimplePanel sp;
  17.         public DockDrag ( )
  18.         {
  19.             InitializeComponent( );
  20.             sp = new SimplePanel(this, Resource1.PanelDefaultIcon, Resource1.PanelClickedIcon );
  21.             sp. SubButtonClick += new EventHandler(sp_SubButtonClick);
  22.             sp. SubButtonMouseLeave += new EventHandler(sp_SubButtonMouseLeave);
  23.         }

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

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

  48.         //添加命令
  49.         private void DockDrag_Load (object sender, EventArgs e)
  50.         {
  51.             IntPtr index = sp. AddItem("系统设置");
  52.             sp. AddItem(index, "批量打印", "CNJ_BatchPlot", Resource1.IM_BATCHPLOT);
  53.             sp. AddItem(index, "插参照块", "CNJ_InsertBlocks", Resource1. IM_EASYBLOCK);
  54.             sp. AddItem(index, "绘制直线", "Line", Resource1. IM_EASYBLOCK);
  55.             sp. AddItem(index, "标高标注", "BG", Resource1. IM_EASYBLOCK);
  56.             sp. AddItem(index, "坡度标注", "PD", Resource1. IM_EASYBLOCK);
  57.             index = sp. AddItem("常用命令");
  58.             sp. AddItem(index, "绘等高线", "DGX", Resource1. IM_EASYBLOCK);
  59.             sp. AddItem(index, "标等高线", "bdgx", Resource1. IM_EASYBLOCK);
  60.             sp. AddItem(index, "超级偏移", "SO", Resource1. IM_EASYBLOCK);
  61.              index = sp. AddItem("系统设置");
  62.             sp. AddItem(index, "批量打印", "CNJ_BatchPlot", Resource1. IM_BATCHPLOT);
  63.             sp. AddItem(index, "插参照块", "CNJ_InsertBlocks", Resource1. IM_EASYBLOCK);
  64.             sp. AddItem(index, "绘制直线", "Line", Resource1. IM_EASYBLOCK);
  65.             sp. AddItem(index, "标高标注", "BG", Resource1. IM_EASYBLOCK);
  66.             sp. AddItem(index, "坡度标注", "PD", Resource1. IM_EASYBLOCK);
  67.             index = sp. AddItem("常用命令");
  68.             sp. AddItem(index, "绘等高线", "DGX", Resource1. IM_EASYBLOCK);
  69.             sp. AddItem(index, "标等高线", "bdgx", Resource1. IM_EASYBLOCK);
  70.             sp. AddItem(index, "超级偏移", "SO", Resource1. IM_EASYBLOCK);
  71.              index = sp. AddItem("系统设置");
  72.             sp. AddItem(index, "批量打印", "CNJ_BatchPlot", Resource1. IM_BATCHPLOT);
  73.             sp. AddItem(index, "插参照块", "CNJ_InsertBlocks", Resource1. IM_EASYBLOCK);
  74.             sp. AddItem(index, "绘制直线", "Line", Resource1. IM_EASYBLOCK);
  75.             sp. AddItem(index, "标高标注", "BG", Resource1. IM_EASYBLOCK);
  76.             sp. AddItem(index, "坡度标注", "PD", Resource1. IM_EASYBLOCK);
  77.             index = sp. AddItem("常用命令");
  78.             sp. AddItem(index, "绘等高线", "DGX", Resource1. IM_EASYBLOCK);
  79.             sp. AddItem(index, "标等高线", "bdgx", Resource1. IM_EASYBLOCK);
  80.             sp. AddItem(index, "超级偏移", "SO", Resource1. IM_EASYBLOCK);
  81.         }
  82.     }
  83. }


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

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

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






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2018-2-4 17:07:39 | 显示全部楼层
本帖最后由 zjh2785 于 2018-2-4 17:20 编辑
zixuan203344 发表于 2018-1-30 09:22
建议:多层级菜单用缩进表示层级,或者前面加层级符号的三角形或者加号,当然也可以用颜色区分,不过没缩进 ...

嗯 其实是可以支持你所说的那样的,在MyPanel的构造函数里边已经有了的  只需要在资源里边把图片加进去可以的
  1.         
  2. public MyPanel (Control parent)
  3.         {
  4.             this. Parent = parent;
  5.             this. Dock = DockStyle. Fill;
  6.             Items = new List<Item>( );
  7.             m_defaultClickImage = DockDrag. GetSource("CADToolBox.Resources.Icon1.ico");
  8.             m_defaultNoClickImage = DockDrag. GetSource("CADToolBox.Resources.Icon2.ico")
  9.             this. ClientSizeChanged += new EventHandler(this. MyPanel_ClientSizeChanged);
  10.             this. MouseWheel += new MouseEventHandler(this. MyPanel_MouseWheel);
  11.         }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 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,
    }
 楼主| 发表于 2018-4-23 13:27:18 | 显示全部楼层
本帖最后由 zjh2785 于 2018-4-23 13:30 编辑
j15tty 发表于 2018-4-21 12:14
是我CAD 是精简版缘故。还有请问一下,如果要做成像26楼那样将tab放置在左边,需要怎么设置?

如果要直接拿我的那个代码该,该动量很大,虽然原理都一样,但这完全是两回事。动态在左侧增加按钮,根据按钮数量确定按钮的位置,然后为添加事件、关联数据。个人看法
不是设置的问题
发表于 2018-1-30 09:22:30 | 显示全部楼层
建议:多层级菜单用缩进表示层级,或者前面加层级符号的三角形或者加号,当然也可以用颜色区分,不过没缩进看着直观
发表于 2018-1-30 20:35:08 | 显示全部楼层
不错不错,但好像少了点什么啊,没有子菜单吗
发表于 2018-1-30 20:58:02 | 显示全部楼层

不错不错   
发表于 2018-1-31 22:18:45 | 显示全部楼层
想知道你用的VS是那一版的, 我安装了VS2017不支持CAD2010~2018开发工具包
发表于 2018-2-1 22:48:19 | 显示全部楼层
却很多内容啊
 楼主| 发表于 2018-2-4 17:17:18 | 显示全部楼层
腾龙 发表于 2018-1-31 22:18
想知道你用的VS是那一版的, 我安装了VS2017不支持CAD2010~2018开发工具包

我用的是2010
发表于 2018-2-7 08:51:51 | 显示全部楼层
谢谢大神分享。
发表于 2018-2-9 12:17:00 | 显示全部楼层
不知道有没有哪个大神知道如何使用VBA直接实现屏幕菜单的效果?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 20:07 , Processed in 0.205427 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表