PowerPoint(PPT)是一款非常优秀的工具软件,可能大家对它的第一印象的是用来播放映幻灯片,给客户展示用。当然,这是它最本质的功能。除此之外,有少部分人把它当作轻量化的矢量绘图软件(比如作者)。实际上,ppt的绘图能力一点都不差,除了能够绘制一些基本的形状之外,2013及之后的版本添加了合并形状的功能,能够实现形状的联合、组合、拆分、相交和剪除,进一步增强了其绘图能力。 用过其他绘图软件的网友应该知道,绘制矢量图时有一个非常常用的功能——阵列。遗憾的是,直到2016版的PPT都没有将这个功能添加进去(可能有,作者没找到),难道是因为没有人需要这种功能吗?也许有网友的动手能力比较强,直接复制后再对齐,非常暴力。作者属于比较懒的,像这种规则的排列是懒得动手的。而且,常用的阵列有三种:矩形、环形、环形并旋转。第一种可以暴力解决,后两种呢?没有一定的三角函数的知识是解决不了的。因此,作者认为,用程序自动阵列是很有必要的。有高手能用VBA解决,缺点是VBA得跟着文档走,PPT默认还会禁用宏,一般用户不打开开发工具还找不着它。在PPT的功能界面添加这么一个功能,既方便又实用。 无图无真相,先上图 ▲三种不同类型的阵列 ▲PPT阵列加载项 “阵列”选项卡完全和内置的选项卡融为一体了,不知道的人还以为是软件自带的功能呢,哈哈。本着能网上下载就不自己动手的原则,先附上下载链接(需要.net 4.0)。 下面开始教程: 序言:作者用的是VS2017,PowerPoint 2016,理论上别的版本也适合。 1、安装开发环境 ▲添加Office/SharePoint开发 2、新建PowerPoint 2013和2016 VSTO外接程序 作者用的是C#,.Net版本需要4.0以上,选中PowerPoint 2013和2016 VSTO外接程序,给你的工程取个名字,如PowerPointArray,单击确定。 3、界面设计 3.1 添加一个Ribbon界面,项目——添加新项——功能区(可视化设计器),随便起个名称,如RibbonArray.cs,如图 3.2 界面设计 单击TadAddIns(内置),在右边修改成属性。ControlldType改成Custom,Label改成阵列。单击group1,其Label改成阵列。在阵列这个group上拉控件: Dropdown——1个,用来存放不同的阵列类型,添加3个Items,Label分别设置为矩形、环形、环形(旋转) EditBox——4个,用来给用户输入参数 Button——1个,生成阵列 最终效果如下图 4、开始写代码 4.1 双击Label为“类型”的DropDown控件,生成SelectionChanged事件,主要用来更改四个EditBox的Label。 private void dropDown1_SelectionChanged(object sender, RibbonControlEventArgs e) { switch (dropDown1.SelectedItemIndex) { case 0: editBox1.Label = '水平间距'; editBox2.Label = '水平数量'; editBox3.Label = '竖直间距'; editBox4.Label = '竖直数量'; break; case 1: case 2: editBox1.Label = '角度'; editBox2.Label = '数量'; editBox3.Label = '中心X'; editBox4.Label = '中心Y'; break; default: break; } }
在RibbonArray_Load事件中添加如下代码,让加载项加载时选中矩形的阵列类型。 dropDown1.SelectedItemIndex = 0;
4.2双击Label为“生成”的Button控件,生成Click事件,为生成阵列的主程序,下面以矩形阵列为例介绍,各行的含义在代码中注释了。 try { if (dropDown1.SelectedItemIndex == 0) { float xInterval = Convert.ToSingle(editBox1.Text) * 72 / 2.54f;//水平方向间距,默认单位为磅,需要转换成厘米 int xNum = Convert.ToInt32(editBox2.Text);//水平方向阵列个数 float yInterval = Convert.ToSingle(editBox3.Text) * 72 / 2.54f;//竖直方向间距,默认单位为磅,需要转换成厘米 int yNum = Convert.ToInt32(editBox4.Text);//竖直方向阵列个数 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left -= 12;//选中图形的位置向左移12磅,复制时会自动加12 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top -= 12;//选中图形的位置向上移12磅,复制时会自动加12 float xOriginal = Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left;//保存下选中图形的初始位置 float yOriginal = Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top; //开始循环复制 for (int x = 1; x <= xnum;=""> { for (int y = 1; y <= ynum;=""> { if (x == 1 && y == 1) continue;//已经有一个了,少复制一个了 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Duplicate();//复制一个,水平和竖直方向会自动加12 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left = xOriginal + (x - 1) * xInterval;//更改原始图的位置,为下一次复制做准备 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top = yOriginal + (y - 1) * yInterval; } } //最后一个移到了右下角的位置,不需要复制了,直接手动加上12 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left += 12; Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top += 12; } else { //其他阵列代码 } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); }
单击启动,此时会自动启动PPT,需要在此之前没有PPT软件没运行。输入合适的参数,点生成就能直接生成阵列了。效果如下图。 环形(旋转)阵列就属于数学问题了,大家可以自己琢磨。
|