【原创】类似天正屏幕菜单效果======开源
本帖最后由 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: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);
}
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:30 编辑
j15tty 发表于 2018-4-21 12:14
是我CAD 是精简版缘故。还有请问一下,如果要做成像26楼那样将tab放置在左边,需要怎么设置?
如果要直接拿我的那个代码该,该动量很大,虽然原理都一样,但这完全是两回事。动态在左侧增加按钮,根据按钮数量确定按钮的位置,然后为添加事件、关联数据。个人看法
不是设置的问题
建议:多层级菜单用缩进表示层级,或者前面加层级符号的三角形或者加号,当然也可以用颜色区分,不过没缩进看着直观 不错不错,但好像少了点什么啊,没有子菜单吗
不错不错 想知道你用的VS是那一版的, 我安装了VS2017不支持CAD2010~2018开发工具包
却很多内容啊 腾龙 发表于 2018-1-31 22:18
想知道你用的VS是那一版的, 我安装了VS2017不支持CAD2010~2018开发工具包
我用的是2010 谢谢大神分享。 不知道有没有哪个大神知道如何使用VBA直接实现屏幕菜单的效果?