感谢IT之家网友 CookTim 的原创投稿
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; x++)
{
for (int y = 1; y <= yNum; y++)
{
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软件没运行。输入合适的参数,点生成就能直接生成阵列了。效果如下图。
环形(旋转)阵列就属于数学问题了,大家可以自己琢磨,再次附上下载连接。
作者编程能力很差,也不规范,本着能解决问题的原则写代码,高手勿嘲笑,有需要的直接下载。
广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本声明。