CorelDRAWX4的VBA插件开发(三十二)调用C++实现一键智能群组(第1节)成品演示以及逻辑和声明浅析
首先上一下成品演示,正所谓有图有真相
这里就简单演示了一下一键智能群组,这个功能看上去很简单,实际上还是有一点点弯弯绕绕
先讲一下大概逻辑: 因为我们只是在开发插件,所以要心可以能地利用原生的功能 ,因为我们并不清楚底层的实现方式 ,所以函数调用就成了很重要的过程 ,这里选取的函数是我在里面找到的一个用来框选内容的功能,叫做
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赋值
CorelDRAWX4的VBA插件开发(三十二)调用C++实现一键智能群组(第1节)成品演示以及逻辑和声明浅析相关推荐
- CorelDRAWX4的VBA插件开发(三十四)调用C++实现一键智能群组(第3节)主调函数以及三个被调函数
这一节就进入到了群组的实质性的内容,先把群组Qunzu()函数展示一下 先展示主调函数Qunzu(),函数里面还有四个被调函数等会儿再说 BOOL Qunzu() {//undo开 这个是一键多步撤销 ...
- CorelDRAWX4的VBA插件开发(三十五)调用C++实现一键智能群组(第4节)递归调用框选工具
上一节没有讲到的递归函数diguiSelect,这一单独列出来讲一下 INT diguiSelect(long count, DOUBLE LX, DOUBLE BY, DOUBLE RX, DOUB ...
- 32.深度解密三十二:详解影响QQ群整体排名的那些秘密
网络营销推广技术.技巧深度解密(三十二)指南: 1.本文档适合零基础以及互联网营销推广人员,主要讲解营销QQ群排名的一些问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬畏法律 ...
- CorelDRAWX4的C++插件开发(三十九)纯C++插件开发(3)声明变量并暴露导出函数
接上一节我们接下来声明一些需要用到的变量 // 声明CorelDRAW变量=VBA::Application类 VGCore::IVGApplication* corelApp = NULL; //声 ...
- CorelDRAWX4的VBA插件开发(三十一)使用C++制作动态连接库DLL辅助VBA构键强大功能-(5)在VBA中动态调用DLL文件
我们先来看一下动态调用的截图 先上代码 '静态调用 Public Declare Function wodedll Lib "E:\VS-DLL\conglingkaishi\Debug\C ...
- CorelDRAWX4的VBA插件开发(四十六)VBA插入启动事件让CDR启动时检测并自动添加工具栏和按钮
先上结果图,这个工具栏和按钮都是主程序自动生成的 在程序的运行当中,如果我们希望程序能够自己创建工具栏和按钮,可以在CDR启动事件中设置一个检测功能 Private Sub GlobalMacroSt ...
- CorelDRAWX4的C++插件开发(三十八)纯C++插件开发(2)导入tlb编译文件
上一节文件建立好了之后,我们把Debug模式改成X86,如果找不到的话,可以在视图-工具栏-标准找到这个界面,因为X4不支持64位的,所以我们只能让他在32位的环境中进行编译调试 然后我们点开顶部项目 ...
- CorelDRAWX4的VBA插件开发(四十五)建立类(2)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线
在上一节中已经建立好了类,那么这一节我们来调用它,先建立一个面板 然后修改框体名称 然后从左侧新建一些按钮并且以拼音为结尾进行命名 Private Sub CheckBox2_zheYe_Click( ...
- CorelDRAWX4的VBA插件开发(四十四)建立类(1)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线
这次主要来浅讲一下"类"这个功能,先上一下要实现的功能,建立设计外框加出血线和等分折页线,先上图 那什么是类呢?类其实就是CLASS,用来封装成员参数和函数的,拆开来里面就是这些东 ...
- ASP 三十二条精华代码
整理收藏: ASP 三十二条精华代码 1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table b ...
最新文章
- TensorFlow基础笔记(11) max_pool2D函数 深度学习
- BootStrap在一行如何展示多行单据
- linux apache两种工作模式详解
- 何时以及如何使用ThreadLocal
- Keyboarding(信息学奥赛一本通-T1452)
- c++-虚函数与多态
- VBS操作XML文档,拷贝结点 (转)
- 查询SQLServer 服务器,执行过的SQL语句耗时!
- win7计算机的蓝牙,手机蓝牙如何与win7电脑连接?win7电脑蓝牙连接手机的方法
- 今日头条android+x86,GitHub - teajoyus/TouTiao: 今日头条 For Android
- 阿里云服务器搭建java环境详细步骤4
- 文件或目录损坏且无法读取的解决办法(集合)
- C# 将PDF文档转换成图片
- python抓取网页图片教程_Python实现简单网页图片抓取完整代码实例
- 广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。
- 春招面经总结(获携程Offer)
- 用一报还一报(TIT FOR TAT)策略的胜利指导我们的生活和人际交往
- android+查看root权限管理,如何查看自己的安卓手机有没有Root权限?
- Chrome浏览器保存微信公众号文章中的图片
- win7计算机cmd查看设备编码,查看windows操作系统的默认编码(字符集)
热门文章
- G - Power Strings
- 信息论基础知识:【信息熵 不确定性】
- 访问网址(使用CDN)时 智能DNS调度 与 用户定位调度(根据IP定位)
- webview播放php音乐,android webview中的音乐的暂停与播放
- 小米max2刷android p,小米max2刷LineageOS记录
- 淘淘商城系列——Redis的安装
- LinkedIn 启用俄勒冈数据中心
- 一种APP和微信远程组态监控台达PLC的方案
- 配电室综合监控系统企业标准(试行)
- html 拖拽图片验证,JavaScript实现拖动滑块拼图验证功能(html5、canvas)