提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
相信我们很多人都有用过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]:意思是开始造轮子?😊。
“app = _app as Corel.Interop.VGCore.Application;”:给app赋予全部Application功能。
“Startup();”:调用其它地方的方法。
执行顺序测试
我们在“Macro.Internal.cs”和 “Macro.cs” 的不同地方代码里加入以下代码:
MessageBox.Show("Internal-1");
MessageBox.Show("Macro-2");
MessageBox.Show("Macro-3");
位置如下图:
切换到CorelDRAW工作区运行一下,可以观察到代码的执行顺序。如下图。
可以知道代码是从“Macro.Internal.cs”开始执行,再到“Macro.cs”; “Macro.cs”中,从“Startup()”再到“Macro1()”。文章来源:https://www.toymoban.com/news/detail-697957.html
结语
VSTAGlobal的结构分析和测试基本完成了,符合预期,您完全可以在Coreldraw Visual Studio Tools for Applications开发插件,更个性化更高效率的去操作Coreldraw。
你也可以在VSTAGlobal编写所有的插件代码,当然建议还是另外建一个项目来编写。下次讨论。
这次的分享就到此了,主要是从自己的经验和理解出发编写教程。由于C#和Coreldraw的知识非常专业,自己的理解和说法可能有偏差或错误,或者代码错误,虚心欢迎大师指正,只当抛砖引玉。谢谢您浏览本教程!最后还原“Macro.Internal.cs”和“Macro.cs”的代码。文章来源地址https://www.toymoban.com/news/detail-697957.html
//----------------------------------------------------------------------------------------------
//Macro.Internal.cs:
//---------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Corel.Interop.VGCore;
namespace VSTAGlobal
{
[System.AttributeUsage(System.AttributeTargets.Class)]
public class CgsAddInModule : System.Attribute { };
[System.AttributeUsage(System.AttributeTargets.Constructor)]
public class CgsAddInConstructor : System.Attribute { };
[System.AttributeUsage(System.AttributeTargets.Method)]
public class CgsAddInMacro : System.Attribute { };
[System.AttributeUsage(System.AttributeTargets.Class)]
public class CgsAddInTool : Attribute
{
public string Guid
{
get { return guid; }
set { guid = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
private string guid;
private string name;
};
[CgsAddInModule]
public partial class Main
{
private Corel.Interop.VGCore.Application app;
[CgsAddInConstructor]
public Main(object _app)
{
app = _app as Corel.Interop.VGCore.Application;
Startup();
}
}
}
//----------------------------------------------------------------------------------------------
//Macro.cs:
//--------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Corel.Interop.VGCore;
namespace VSTAGlobal
{
public partial class Main
{
private void Startup()
{
}
[CgsAddInMacro]
public void Macro1()
{
MessageBox.Show("Macro1 - " + app.Name);
}
}
}
到了这里,关于初识Coreldraw Visual Studio Tools for Applications的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!