提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、初识CoreldrawVisualStudioToolsfor Applications
  • 二、Visual Studio Tools for Applications的编程环境
  • 结语

前言

相信我们很多人都有用过Coreldraw Vba二次开发来编写插件操作Coreldraw做设计排版的经历。VBA代码组织不够理想,错误提示不够友好,批量修改不够方便。所以Coreldraw引入了微软的VSTA,集成Visual Studio Tools for Applicatons试图来解决这一系列问题。Coreldraw Vsta默认用C#语言编写插件,而C#语法严谨,代码编写自动提示、批量更改和错误提醒体验都很优秀,所以我们探讨一下是否可以从Visual Basic for Applicatons 转向Coreldraw Visual Studio Tools for Applications。


一、初识CoreldrawVisualStudioToolsfor Applications

试运行Coreldraw Visual Studio Tools for Applications
首先打开CorelDRAW,选择菜单命令“工具”,鼠标依次移到“宏”-”VSTA编辑器”,单击。如下。

可能会出现下面的提示。

确定。会再弹出以下错误提示。

这就是提示我们要先安装Microsoft Visual Studio Tools for Applications 2017。可以从https://www.microsoft.com/zh-CN/download/details.aspx?id=56046网页下载安装。注意,由于CorelDRAW引入了VSTA,而安装要先关闭有关的Visual Studio工具,有可能要要先关闭CorelDRAW,安装才能完成。安装完成就可以打开VSTA编辑器了。
这里我们再次选择菜单命令“工具”,鼠标依次移到“宏”-” 宏管理器”,选择它,在右边的泊物窗中可以看到Visual Studio Tools for Applications。如下。

依次展开Visual Studio Tools for Applications,如下。

这里有一个项目VSTAGlobal,从字面上理解就是全局VSTA的意思,和Visual Basic for Applications中的GlobalMacros类似,是配置CorelDRAW的启动和退出等环境事件用的。单击Macro1,弹出以下窗体。

这是C#代码调试中很常见的界面,方法是MessageBox.Show,就是消息框,用于验证你的代码数据或提示用户,和VBA中的MsgBox用法类似。这个消息框会阻塞代码的运行,只有确定后后面的代码才会继续继续。题外话,在Timer事件中千万不要不要插入消息框,由于Timer是开另外的线程执行并且是间隔事件的循环,它就会弹出无数个消息框,让你关都来不及关。这里我们就点“确定”。

二、Visual Studio Tools for Applications的编程环境

还是在宏管理器界面,右击Macro1,选编辑,首次进入要等一会儿才会调出VisualStudio,界面如下。

可以看到,Vsta编程环境和外部VisualStudio编程环境没多大区别。
我们先找到解决方案资源管理器,选择解决方案,再选择属性。如下。

可以看到,这个全局宏保存在电脑C盘很深的目录下,如果你要在这里写代码,重装电脑可能要先备份这个项目。如下。

再看项目属性。再回到资源管理器,右单击VSTAGlobal,进入如下界面。

可见输出的类型是类库,应该是.dll,但查看解决方案本地目录,找不到Global.dll,也许这是VSTA的特性。另外dll也不能直接运行,要回到Coreldraw的工作环境才能执行VSTA宏。

目标框架,可以选择.net版本,高版本会有一些新的结构、对象、和方法等。切换版本一般没有问题,也有可能出现一些错误需要手动去更改。

项目结构

切换到资源管理器,把下面的文档都展开。如下。

可以看到,项目结构主要包括属性、引用和代码文档。属性下是项目程序集信息的代码文档;引用下是本项目所导入的DLL程序集;C#代码块中有两个代码文档,代码文档下有类的定义,类的定义下有属性、变量、方法的定义等。CorelDRAW 已经为我们配置好了二次开发的环境,Corel.Interop.VGCore.dll是提供给用户开发插件的的程序集,在CorelDRAW的安装目录可以找到。

代码结构和代码分析

Macro.cs
切换到Macro.cs文档窗口,如果没打开,可以在资源管理器中找到双击打开。如下。

代码“using Corel.Interop.VGCore;”是指在本文档中引入Corel.Interop.VGCore的VGCore程序集信息,让代码可以直接定位VGCore,暴露里面的接口、类型等给用户,让用户可以便捷的访问。比如VGCore中有一个类Shape,您就可以在Macro1中这样写:
Shape shape = app.ActiveShape;
如下图。

如果去掉“using Corel.Interop.VGCore;”这一句,“Shape shape = app.ActiveShape;”会出错,Shape一词下面会有波浪红线,鼠标停放在单词上面会有错误提示。如下。

您应该这样写:

Corel.Interop.VGCore.Shape shape = app.ActiveShape;

这样才不会出错。如下图。

这样写代码就不方便了,因为我们的主要操作对象是CorelDRAW,所以引用VGCore是必须的。
但这样也会产生一些冲突,比如引用块中 “using System.Windows.Forms;”和“using Corel.Interop.VGCore; ”同时存在,你就不能在Macro1中这样写:
Application bpp = new Application();
错误如下图:

这是因为System.Windows.Forms程序集和Corel.Interop.VGCore程序集都有Application这个类,所以编译器无法确定你的Application是指代哪个程序集的Application,所以发生定义冲突。
考虑到Forms也是我们常用的程序集,VSTA已经自动引用,有没有其它的冲突要随着编程的深入才知道。为了解决这个问题,我们可以文档引用块再写入以下一行:
using Cdr = Corel.Interop.VGCore;
对于错误的代码“Application bpp = new Application();”我们就可以改:
Cdr.Application bpp = new Cdr.Application();
如下图。

我们来测试一下,回到CorelDRAW工作区的Visual Studio Tools for Applicatons。如下图。

双击Macro1,运行一下C#宏,弹出框中有以下错误:

发生了对象和类型转换的错误,就是“Cdr.Application bpp = new Cdr.Application();”这条代码有问题,实际上Cdr.Application已经在配置时已是实例化对象,是不能new一个的,改为以下代码:
Cdr.Application bpp = app as Cdr.Application;
再次运行,就没有问题了。但如果不能new一个Cdr.Application,上面的代码就没有必要了,app和bpp都指向同一个对象,app如果消失,bpp就同时消失了,只是用不同的变量名去代表Cdr.Application而已。
namespace VSTAGlobal:
namespace,命名空间,“VSTA”是“Visual Studio Tools for Applications”的简称,“Global”是“全局的意思,合起来VSTAGlobal是命名空间的名称。命名空间是.net时代的新名词,听起来有些高大上,一时让人难以理解。name名字,space空间,这两个词加在一起直译就是名字空间了,译为名字空间实在是实在是无法理解,就改为命名空间了。初一听,也就有点莫名其妙的感觉。按本人的经验,你就去掉“name”,把他当作“space”就行,可以理解为代码工作区,意思是你该调用的东西(using)都给你加进来了,你就从这里开始写代码的工作吧。Coreldraw有一个词,叫工作区,觉得namespace改为workspace或codespace比较好。当然一个C#代码文档中可以加入多个命名空间,一般是复制别人或者自己别处的代码供使用,如果有必要,我们再来研究。
顺便 提一下,C#代码多是用大括号来定义代码结构,有起始的大括号就要有结束的大括号来对应。如果编写代码时大括号对不齐,可以选中某一块代码,Ctrl+K组合键,再按F键快速对齐代码。但如果代码中大括号无法一一对应或存在其它错误,就无法起作用了,更正错误后才能用快捷键对齐。要注释某一行代码就在代码前面用“//”就可以了,多行代码注释也是用Ctrl+K组合键先定义块,然后C键就可以了。取消某条代码就删掉前面的“//”, 取消多条代码,也是用Ctrl+K,再按U键。这些都比VBA方便。一行代码的结束就按回车键,和VBA一样。C#中的名称如果要更改,要把鼠标停留在更改的名称上,看是否要让VisualStudio自动更新。
public partial class Main:class,类的意思,按本人的经验来理解,就是比拟自然界的物以类聚现象来规划设计的,能成为一类的都有相似的特征、属性、行为、功能,比如人类就能有社交属性,能写代码等;在程序代码中就是能给你定义一些属性、能执行一定的方法(函数)、在特定的情况下会发生一定的行为(事件函数)等的代码集合。
Main:就是类的名称,比如这就是动物类,这就是植物类等。Main类主要类,让人知道这里一般是程序入口点。
Public:这是公共类,如果是用在人类方面就可以理解为公众类。既是公众,就是公开的,别的类里面的成员都可以通过某种方法去访问(取得)你公开的(Public)的某些东西(属性),或借用你的某种工具(函数,方法),而这种工具或方法就是函数里的代码块。但访问Public类时都要new一个Public类,这是不是可以理解为你可以复制一个我来用,但不能原原本本的把我搬过来,不然就有冲突了,因为可能还有还有别的人约会我。
Partial:单从字面上理解就是分开的意思,实际上也是这样,就是VisualStudio把这个类分成不同的文档(同样的命名空间)存放了,就像窗体构造代码和应用代码分开一样。这里的结构有些新,还要深入研究。
private void Startup() :函数,也可以叫方法。这里是一个空函数,如果有必要你可以在里面写代码。C#没有像VBA中的Sub块了,统一为函数了,想想也合理,VBA中的Sub和Function功能都差不多,只是Function有返回值。Private就规定了这是不开源的方法,其它外部类要借用这里的方法想都不用想了。
public void Macro1():公共函数,同一个类中的函数都可以直接访问,而其它类中的函数也可以通过类来借用。
[CgsAddInMacro]:
拆开来看一下它的意思,“Cgs"应该是几个英文单词连起来的简写,C应该是C或C#吧,猜不出来了。Addin明显就是插件的意思。Macro,就是宏。连起来理解就是Cgs插件宏。经过测试,也证实了这一点。您可以在”Macro1()“函数的后面插入以下代码:
[CgsAddInMacro]
public void Macro2()
{
MessageBox.Show("Macro2 - " + app.Name);
}
如下图。

回到Coreldraw,就可以看见,一个新的模块Macro2生成了。如下图。

双击Macro2,一样能弹出消息框。
我们来测试一下是否可以编程操作文档中的对象。
把“public void Macro1()”函数中的代码改为如下:

//MessageBox.Show("Macro1 - " + app.Name);//测试是否可以对Application中的对象实例化ShapeRange shpr = new ShapeRange();shpr.Add(app.ActiveShape);//设置文档的尺寸单位为毫米,而不是像素,点,米等app.ActiveDocument.Unit = cdrUnit.cdrMillimeter;//弹出消息框验证所程序中得到选图形的高度是否正确//ToString()这里是将双精度实数double转为文本类MessageBox.Show("图片高度是:"+app.ActiveShape.SizeHeight .ToString());
   如下图。

回到Coreldraw,先选定一张图片,运行宏,效果如下图:

完全没有问题。
Macro.lInternal.cs
再看一下Macro.lInternal.cs。如下图。

这里也引用了VGCore程序集,因为不同的代码文档的引用都是独立的。
public class CgsAddInTool : System.Attribute,这里类名是CgsAddInTool,” : “说明CgsAddInTool类继承于System程序集的Attribute类,在此基础上再加入了下面的一些属性和方法。当然这里也可以去掉“System.”,只留下Attribute,因为不会有冲突。
public string Guid:定义了一个名为Guid的属性,作为这个类的属性之一。里面有get和set,规定这个属性值不是只读的,既可以获取属性的值也可以赋值给属性。
比如你可以在public Main(object _app)中加入以下代码:

   CgsAddInTool cgsAddInTool = new CgsAddInTool();cgsAddInTool.Guid = "2cc24a3e-fe24-4708-9a74-9c75406eebcd";string x = cgsAddInTool.Guid;MessageBox.Show(x);

测试也没有问题。
命名空间里面是类,类里面有属性、方法,构成了C#代码文件的最基本的结构。也许可以这样来比拟,命名空间就是自然界的空间,比如地球空间,人类空间等;类是某一空间中的某一类物质对象的集合,比如动物类,植物类;一个类中都有实例化的对象,这些对象被概括为有一定的属性,有一定的方法去解决问题,在发生某种事件时会做出相应的反应(事件)等。
“private Corel.Interop.VGCore.Application app;”:定义了一个Application的引用,你可以引用这个名称去访问Application里面的对象。
[CgsAddInConstructor]:意思是开始造轮子?

初识Coreldraw Visual Studio Tools for Applications相关推荐

  1. 和我一起学VSTA(Visual Studio Tools for Applications )(一)

    VSTA(Visual Studio Tools for Applications ),是一项微软的新技术,它的作用和VBA类似,可以为应用程序的二次开发人员提供一个Visual Studio环境以及 ...

  2. UnityVS(Visual Studio Tools For Unity)的安装与使用

    一些废话 Unity 的开发者们,尤其是微软系的Unity开发者们,用Mono是不是烦死了?你是不是跟我一样,用vs来写代码,用Mono来跟踪调试?好麻烦啊好麻烦. 也许你会说,傻逼你不会用Unity ...

  3. 认识微软Visual Studio Tools for AI

    微软已经发布了其 Visual Studio Tools for AI 的测试版本,这是微软 Visual Studio 2017 IDE 的扩展,可以让开发人员和数据科学家将深度学习模型嵌入到应用程 ...

  4. Microsoft Visual Studio Tools for AI

    https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...

  5. 【转】UnityVS(Visual Studio Tools For Unity)的安装与使用

    Unity 的开发者们,尤其是微软系的Unity开发者们,用Mono是不是烦死了?你是不是跟我一样,用vs来写代码,用Mono来跟踪调试?好麻烦啊好麻烦. 也许你会说,傻逼你不会用UnityVS插件么 ...

  6. [转]Visual Studio 项目类型 GUID 清单

    转自:https://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs Complete li ...

  7. Visual Studio的工程结构解析

    废话不多说,首先查看下一个简单的sln文件结构 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio  ...

  8. [转]Cordova + Ionic in Visual Studio - 101 Tutorial [Part I]

    本文转自:http://binarylies.ghost.io/cordova-ionic-in-visual-studio/ Hi everyone, I thought about lending ...

  9. Visual Studio 和 .NET Framework 词汇表(vs2008)

    本词汇表定义了 Visual Studio 2008 和 .NET Framework 中的关键术语. .NET Compact Framework 一种独立于硬件的环境,用于在资源受限制的计算设备上 ...

最新文章

  1. 【进展】温度监测报警器(系统)作品项目快发布了!
  2. ugui源码_UGUI 源码笔记(一)文件结构和部分组件使用
  3. struts2原理分析之反射技术动态获取属性
  4. 获取套接字相关联信息
  5. 面积计算(洛谷P5681题题解,Java语言描述)
  6. 苹果iOS 15正式发布!一大波新功能上线,这几个被刷爆了
  7. 记一次ubuntu误操作导致无法用sudo
  8. 计算机课程联合考试是什么意思,计算机技术在职研究生能否通过一月联考的方式学习课程内容...
  9. 2021年葡萄酒酿造及葡萄酒产业发展研究报告
  10. 如何导入JDBC驱动
  11. 宽带波束形成及MATLAB实现
  12. 基于simhash的短文本去重
  13. html5跳跳蛙小游戏分析,中班科学优秀教案《跳跳蛙》(5页)-原创力文档
  14. 停止内耗:过一个不累的人生-读书笔记
  15. redhat oracle 12c 安装图解,RedHat 7 静默安装Oracle 12c
  16. WINDOWS更改无线网卡MAC地址的方法
  17. 高德地图定位失败_高德开放平台
  18. 简单好用的树莓派磁盘空间管理工具
  19. 题目错题记录表mysql设计_基于Web2.0的跨平台电子错题本功能的设计与实现
  20. linux gnu binutils,binutils源码分析之准备篇

热门文章

  1. 逻辑回归(LR实则分类)的损失函数
  2. 江苏2021计算机专业单招院校,2021江苏单招专科学校排名大学:2021年江苏提前单招学校有哪些...
  3. 逾期用户画像及不良贷款率分析
  4. 电脑怎么制作GIF动态图,如何做表情包
  5. CT主控计算机功能不包括,​项目四 计算机X线体层成像 任务二CT的基本硬件与CT的类型...
  6. 使用BLOB 进行docx格式文件、zip压缩包下载
  7. 学习sobel算子对图像求导自我理解
  8. IO多路复用机制——epoll
  9. 阿里云 windows mysql_Windows下MySQL下载安装、配置与使用
  10. SpringBoot项目中ShiroConfig 配置文件无法注入bean和使用@Value注解的问题