AutoCAD.Net/C#.Net QQ群:193522571 AutoCAD .Net 创建Ribbon界面并且进行执行
版权声明:本文为CSDN博主「HisinWang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hisinwang/article/details/78797068
从 AutoCAD 2009 版开始,引入了 Ribbon 界面。
那怎样用代码创建 Ribbon 界面呢?
本篇文章讲解如何创建如下图所示的 Ribbon Tab 页:测试Ribbon页。
如上图所示:
AutoCAD 的 Ribbon 界面由一系列 Tab 组成:默认、插入、注释……
测试Ribbon页 是我们创建的 Tab 页。
它由两个 Panel 组成:Panel1、Panel2。
Panel 下面就是三个按钮:直线、圆、Test。
那怎样用代码创建 Ribbon 界面呢?
本篇文章讲解如何创建如下图所示的 Ribbon Tab 页:测试Ribbon页。
如上图所示:
AutoCAD 的 Ribbon 界面由一系列 Tab 组成:默认、插入、注释……
测试Ribbon页 是我们创建的 Tab 页。
它由两个 Panel 组成:Panel1、Panel2。
Panel 下面就是三个按钮:直线、圆、Test。
除了需要添加 AutoCAD 引用: acmgd、acdbmgd、accoremgd(AutoCAD 2012版本及后续版本)。
还需要添加如下 AutoCAD 引用:
* AcWindows
* AdWindows
还需要添加如下 AutoCAD 引用:
* AcWindows
* AdWindows
using System; using System.Collections.Generic; using System.Text; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Ribbon; using Autodesk.Windows; //----------------------------------------------- private static RibbonTab myRibbonTab = null; [CommandMethod("MyRibbonTab")] public static void MyRibbonTab() { // 创建Ribbon Tab页 if (myRibbonTab == null) { myRibbonTab = new RibbonTab(); myRibbonTab.Title = "测试Ribbon页"; myRibbonTab.Id = "MyRibbonTab"; // RibbonPanel panel1 = new RibbonPanel(); RibbonPanelSource panel1Src = new RibbonPanelSource(); panel1Src.Title = "Panel 1"; panel1.Source = panel1Src; myRibbonTab.Panels.Add(panel1); RibbonButton rbnBtnLine = NewRibbonBtn("直线"); panel1Src.Items.Add(rbnBtnLine); RibbonButton rbnBtnCircle = NewRibbonBtn("圆"); panel1Src.Items.Add(rbnBtnCircle); // RibbonPanel panel2 = new RibbonPanel(); RibbonPanelSource panel2Src = new RibbonPanelSource(); panel2Src.Title = "Panel 2"; panel2.Source = panel2Src; myRibbonTab.Panels.Add(panel2); RibbonButton rbnBtnTest = NewRibbonBtn("Test"); panel2Src.Items.Add(rbnBtnTest); } // 在AutoCAD的Ribbon窗口中显示 RibbonControl ribCntrl = RibbonServices.RibbonPaletteSet.RibbonControl; ribCntrl.Tabs.Add(myRibbonTab); } private static RibbonButton NewRibbonBtn(string text) { RibbonButton button = new RibbonButton(); button.Text = text; button.ShowText = true; return button; } --------------------- 版权声明:本文为CSDN博主「HisinWang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hisinwang/article/details/78797068
以上部分,只是实现了 Ribbon 界面,但 Ribbon 按钮还没实现触发执行命令。
首先,我们实现一自定义类 AdskCommandHandler,通过该类关联 Ribbon 按钮和对应的命令。
public class AdskCommonHandler : ICommand { public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { RibbonButton button = parameter as RibbonButton; if (button != null) { Application.DocumentManager.MdiActiveDocument.SendStringToExecute( (string)button.CommandParameter, true, false, true); } } } --------------------- 版权声明:本文为CSDN博主「HisinWang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hisinwang/article/details/78797068
然后,更改 MyRibbonTab 代码如下:
using System; using System.Collections.Generic; using System.Text; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Ribbon; using Autodesk.Windows; //----------------------------------------------- private static RibbonTab myRibbonTab = null; [CommandMethod("MyRibbonTab")] public static void MyRibbonTab() { // 创建Ribbon Tab页 if (myRibbonTab == null) { myRibbonTab = new RibbonTab(); myRibbonTab.Title = "测试Ribbon页"; myRibbonTab.Id = "MyRibbonTab"; // RibbonPanel panel1 = new RibbonPanel(); RibbonPanelSource panel1Src = new RibbonPanelSource(); panel1Src.Title = "Panel 1"; panel1.Source = panel1Src; myRibbonTab.Panels.Add(panel1); RibbonButton rbnBtnLine = NewRibbonBtn("直线", "line "); panel1Src.Items.Add(rbnBtnLine); RibbonButton rbnBtnCircle = NewRibbonBtn("圆", "circle "); panel1Src.Items.Add(rbnBtnCircle); // RibbonPanel panel2 = new RibbonPanel(); RibbonPanelSource panel2Src = new RibbonPanelSource(); panel2Src.Title = "Panel 2"; panel2.Source = panel2Src; myRibbonTab.Panels.Add(panel2); RibbonButton rbnBtnTest = NewRibbonBtn("Test", "MyCmdTest "); panel2Src.Items.Add(rbnBtnTest); } // 在AutoCAD的Ribbon窗口中显示 RibbonControl ribCntrl = RibbonServices.RibbonPaletteSet.RibbonControl; bool isShow = false; foreach (RibbonTab rbnTab in ribCntrl.Tabs) { if (rbnTab == myRibbonTab) { isShow = true; break; } } if (!isShow) { ribCntrl.Tabs.Add(myRibbonTab); } } [CommandMethod("MyCmdTest")] public static void MyCmdTest() { Document doc = Application.DocumentManager.MdiActiveDocument; doc.Editor.WriteMessage("www.caxdev.com\n"); } private static RibbonButton NewRibbonBtn(string text, string cmd) { RibbonButton button = new RibbonButton(); button.Text = text; button.ShowText = true; button.CommandHandler = new AdskCommonHandler(); button.CommandParameter = cmd; return button; } --------------------- 版权声明:本文为CSDN博主「HisinWang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hisinwang/article/details/78797068
上一篇文章实现了简单的 Ribbon 页面,仅仅包含了文字按钮。
接下来,我们来实现如下图所示的包含图片的 Ribbon 控件。
首先,在项目中添加资源文件。在资源文件中添加两张图片:
* smiley_16x16.png
* smiley_32x32.png
接下来,我们来实现如下图所示的包含图片的 Ribbon 控件。
首先,在项目中添加资源文件。在资源文件中添加两张图片:
* smiley_16x16.png
* smiley_32x32.png
大小分别是 16x16 和 32x32。
将上一篇中创建 Ribbon 按钮的代码替换为如下的代码。
将上一篇中创建 Ribbon 按钮的代码替换为如下的代码。
// 按钮 Test1 RibbonButton btn1 = new RibbonButton(); btn1.Text = "Test1"; btn1.ShowText = true; btn1.Image = ImageSourceForBitmap(Resource1.smiley_16x16); btn1.LargeImage = ImageSourceForBitmap(Resource1.smiley_32x32); btn1.ShowImage = true; btn1.Size = RibbonItemSize.Large; btn1.Orientation = System.Windows.Controls.Orientation.Horizontal; panelSrc.Items.Add(btn1); // 按钮 Test2 RibbonButton btn2 = new RibbonButton(); btn2.Text = "Test2"; btn2.ShowText = true; btn2.Image = ImageSourceForBitmap(Resource1.smiley_16x16); btn2.LargeImage = ImageSourceForBitmap(Resource1.smiley_32x32); btn2.ShowImage = true; btn2.Size = RibbonItemSize.Large; btn2.Orientation = System.Windows.Controls.Orientation.Vertical; panelSrc.Items.Add(btn2); // 按钮 Test3 RibbonButton btn3 = new RibbonButton(); btn3.Text = "Test2"; btn3.ShowText = true; btn3.Image = ImageSourceForBitmap(Resource1.smiley_16x16); btn3.LargeImage = ImageSourceForBitmap(Resource1.smiley_32x32); btn3.ShowImage = true; btn3.Size = RibbonItemSize.Standard; btn3.Orientation = System.Windows.Controls.Orientation.Vertical; panelSrc.Items.Add(btn3); --------------------- 版权声明:本文为CSDN博主「HisinWang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hisinwang/article/details/78797087
添加引用 System.Drawing。
还要添加如下的处理 Bitmap 的代码。
using System; using System.Text; using System.Runtime.InteropServices; using System.Drawing; using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Interop;12345678 [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteObject([In] IntPtr hObject); public static ImageSource ImageSourceForBitmap(Bitmap bmp) { var handle = bmp.GetHbitmap(); try { return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } finally { DeleteObject(handle); } } --------------------- 版权声明:本文为CSDN博主「HisinWang」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hisinwang/article/details/78797087
RibbonButton 有两个属性 Image 和 LargeImage,分别存放小图片和大图片。
小图片大小应为 16x16。
大图片大小应为 32x32。
最终,显示小图片还是大图片,通过指定 Size 为 RibbonItemSize.Standard 还是 RibbonItemSize.Large 确定。
ShowText,是否显示文字。
ShowImage,是否显示图片。
Orientation,指定文字、图片的排布方式。