-
首先上一下成品演示,正所谓有图有真相
-
这里就简单演示了一下一键智能群组,这个功能看上去很简单,实际上还是有一点点弯弯绕绕
-
先讲一下大概逻辑: 因为我们只是在开发插件,所以要心可以能地利用原生的功能 ,因为我们并不清楚底层的实现方式 ,所以函数调用就成了很重要的过程 ,这里选取的函数是我在里面找到的一个用来框选内容的功能,叫做
SelectShapesFromRectangle
,直译叫做通过矩形选框得到形状. -
好了,废话不多讲,我们直接进入代码阶段,先从C++的声明开始讲起
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
//这个PCH是程序的预编译头文件,用来储存每个文件都基本会用到的内容,默认是每个CPP文件里面都会包含的,目的是为了节省编译遍数,同时也就节省了时间
#include "d:\VS2019\Cine\VGCoreAuto.tlh"
//这个是我们之前第二十八章写编译好的tlb文件的头文件,只要引用了这个头文件,那么VS就能识别出所有的CDR中的类
//声明------------------------------------------------------------------------
VGCore::IVGApplication* corelApp;
/*前面的变量名是一个指针, 指向"命名空间"VGCore内部, 我们打开VGCoreAuto.tlh文件后,
可以发现在整个内部就是一个命名空间, 名为"VGCore", 后面的双冒号是固定用法, 后面接
命名空间下的内容, 我们可以发现名为IVGApplication是一个结构体struct,这个结构体包含870
多行的代码,可以说是整个CDR内部一个非常大也非常重要的结构体,因为CDR内部的结构体非常多
所以他们用了一个uuid__declspec(uuid)用于编译器关联一个GUID到一个有uuid属性的类或结构
的声明或者定义,通过ID来连接到本体.我们可以看到这个ID为uuid("b058000b-9aa4-44fd-9547-4f91eb757ac4"),
我们可以在第15164行找到这个结构体,IVGApplication : IDispatch后面的冒号加 IDispatch
是被指向的位置的固定用法.我们再看到这870行代码中被分为了三个部分,第一个部分就是属性,
第二个部分是方法,也就是函数,第三个部分是响应事件,我们还可以发现它本身就是属于tlb文件,
而tlb文件本来就是支持计算机_COM规则的写法的,本来也就只有符合这种写法的才能被不同的语言
调用.所以我们要写动态链接库,最后重要的就是找到当前运行的CDR的这个名为IVGApplication的
结构体,所以我在这里用了一个结构体指针,希望在主程序调用本功能的时候把这个结构体地址传过来,
这样后面的程序就能通过这个地址操作当前的CDR.所以在VBA中我们调用这个函数的时候是传了
一个CorelDRAW.Application,在VBA中这个Application就是储存的IVGApplication的内存地址.
所以在被调用的函数中我们第一件事就把这个IVGApplication赋值
*/
HWND hAppWnd;
/*这个是一个窗口句柄,声明的是一个HWND,是一个句柄值,H代表句柄,WND代表窗口,其实里面就是
一个整数而已,是WINDOWS系统为每个控件分配的.这里我要传的是CDR主程序的窗口句柄值,所以可
以看到我们在VBA中调用的时候传过来的是一个CorelDRAW.Windows.Item(1).Handle,其实这个值不
传也也没有关系,我们也可以通过IVGApplication来找到它
*/
//------------------------------------------------------------------------声明
-
所有的注释我都直接写在了代码下面, 这个符号
//
和/*
以及*/
都是用来注释用的,用来写我们自己能够看懂的文字, 写程序往往需要写好注释,因为过了一段时间回头再来看如果没有写注释会要浪费很多时间来理解代码.所以养成写注释的好习惯很重要. -
这里着重再用文字写一下最重要的一段
VGCore::IVGApplication* corelApp;
- 前面的变量名是一个指针, 指向
"命名空间"VGCore
内部, 我们打开VGCoreAuto.tlh
文件后, 可以发现在整个内部就是一个命名空间, 名为"VGCore", - 后面的双冒号是固定用法, 后面接命名空间下的内容,
- 我们可以发现名为
IVGApplication
是一个结构体struct
,这个结构体包含870多行的代码,可以说是整个CDR内部一个非常大非常重要的结构体, - 因为CDR内部的结构体非常多所以他们用了一个uuid__declspec(uuid)
- uuid__declspec(uuid)用于编译器关联一个GUID到一个有uuid属性的类或结构的声明或者定义,因为行数太多,所以
通过这个ID来连接到本体
. - 我们可以看到这个ID为uuid(“b058000b-9aa4-44fd-9547-4f91eb757ac4”),我们可以在第15164行找到这个结构体,
IVGApplication : IDispatch
后面的冒号加IDispatch
是被指向的代码的固定用法. - 我们再看到这870行代码中被分为了三个部分,第一个部分就是
属性
,第二个部分是方法
,也就是函数,第三个部分是响应事件
, - 我们还可以发现它本身就是属于tlb文件,而tlb文件本来就是支持计算机_COM规则的写法的,本来也就只有符合这种写法的才能被不同的语言调用.
- 所以我们要写动态链接库,最重要的就是找到当前运行的CDR的这个名为IVGApplication的结构体,所以我在这里用了一个
结构体指针
,希望在主程序调用本功能的时候把这个结构体地址传过来,这样后面的程序就能通过这个地址操作当前的CDR. - 所以在VBA中我们调用这个函数的时候是传了一个CorelDRAW.Application,在VBA中这个Application就是储存的IVGApplication的内存地址.所以在被调用的函数中我们第一件事就把这个IVGApplication赋值