版权声明:本文为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,指定文字、图片的排布方式。