CorelDRAWX4的VBA插件开发(三十五)调用C++实现一键智能群组(第4节)递归调用框选工具
- 上一节没有讲到的递归函数diguiSelect,这一单独列出来讲一下
INT diguiSelect(long count, DOUBLE LX, DOUBLE BY, DOUBLE RX, DOUBLE TY, INT& okShapeCount, _bstr_t myShapeName) {//第一个参数是当前框选的数量,由上一级的递归函数传入,每一次一定是不同的,每递进一次都应该是增多的//触碰模式划框 这里就是执行框选功能了corelApp->ActivePage->SelectShapesFromRectangle(LX, BY, RX, TY, TRUE);if (count >= corelApp->ActiveSelection->Shapes->Count) { //如果传参数量终于大于或者等于新框选的数量执行回归部分//递归判定--回归if (corelApp->ActiveSelection->Shapes->Count == 0) {//框选不到锁定对象时直接回归跳出递归:说明当前定位的是无效形状,返回1return 1;}//框选到对象时:说明当前形状是有效形状则继续执行VGCore::IVGShapePtr myshape = corelApp->ActiveSelection->Group(); //执行群组myshape->Name = myShapeName; //更改成功群组的形状命名为我之前设定的名称okShapeCount += 1; //成功群组总数+1return 0; //成功就返回0 }else {//递归判定--递进return diguiSelect(corelApp->ActiveSelection->Shapes->Count, corelApp->ActiveSelection->LeftX, corelApp->ActiveSelection->BottomY, corelApp->ActiveSelection->RightX, corelApp->ActiveSelection->TopY, okShapeCount, myShapeName);}
}
- 递归函数–群组的核心功能—框选触碰到的形状SHAPE直到传参count与select.count相等,
- 原理是这样的,在CDR当中有一个函数名为
SelectShapesFromRectangle(LX, BY, RX, TY, TRUE)
;可以看到这个函数有五个参数,前面四个参数是用位一个矩形框的四个角,形成一个选框,也就相当于是用鼠标划了一个选框 - 而第五个参数如果是FALSE,那么选框仅仅碰到的形状是不包含在内,但如果是TRUE,那么碰到的也包含在内,
- 那么这个功能就非常关键,只要碰到就包含,那就围绕这个功能做一次递归,当我们选择了任意一个形状并框选一次之后,如果包含的数量变多了,说明多出来的形状还有可能和别的形状重叠,所以就再递进一次用包含着更多的形状的选框再框选一次,就这样一直递进下去,直到有一次形状数量不再增多就执行回归,
- 那么这就是递归函数,只要不满足要求就一直递进.直到满足了才回归,这种写法很爽,理论上来说可以省去无数行的代码.它递进多少次有可能是几百上千次.
- 再讲到下面的递进
return diguiSelect
就是把函数体本身带上新的新参数再返回一次,可以看到这次再调用相同的函数时,往里面传的参数和外面传进来的是有变化的.第一个参数就是新框选数量,紧接着四个就是新框选的四个角,ActiveSelection
就是新框选的,最后面两个参数okShapeCount, myShapeName
分别就是群组总数和成功的命名,而且这个总数是用的&
符号,说明传进来的是值是一个内存地址,也就是值okShapeCount本身
,在函数内部运算后增加变化了都会影响到它本身,所以就算出了递归函数这个值也是被改变了的,反之如果不带这个&符号,那么这个值与外面的那个参数是无关的,所以必须要带取址符,这样层层递进okShapeCount的值是一直在变化的.
CorelDRAWX4的VBA插件开发(三十五)调用C++实现一键智能群组(第4节)递归调用框选工具相关推荐
- CorelDRAWX4的VBA插件开发(三十四)调用C++实现一键智能群组(第3节)主调函数以及三个被调函数
这一节就进入到了群组的实质性的内容,先把群组Qunzu()函数展示一下 先展示主调函数Qunzu(),函数里面还有四个被调函数等会儿再说 BOOL Qunzu() {//undo开 这个是一键多步撤销 ...
- CorelDRAWX4的VBA插件开发(二十五)多类目选择实现复合框内容置换
有时候我们的复合框内的内容是有更多的需求,但是我们又不想另开一个窗口,怎么办呢,我们直接使用复合框内容替换就行啦 先上效果图: 先在面第板上拉出一个框架, 再在里面添加上三个选项按钮, 添加好之后这三 ...
- CorelDRAWX4的VBA插件开发(四十五)建立类(2)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线
在上一节中已经建立好了类,那么这一节我们来调用它,先建立一个面板 然后修改框体名称 然后从左侧新建一些按钮并且以拼音为结尾进行命名 Private Sub CheckBox2_zheYe_Click( ...
- 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插件开发(二十四)复合选框组件与联合命名面板
我们在处理文档的时候碰上的最多的问题就是与字符串相当的问题,这里再拿出来单把各种使用命名的小组件讲一下,我们先上效果图: 我们可以在上图看到最终结果,可以让一行文件名跟随各种组件进行更改,下下面我们先 ...
- CorelDRAWX4的VBA插件开发(四十六)VBA插入启动事件让CDR启动时检测并自动添加工具栏和按钮
先上结果图,这个工具栏和按钮都是主程序自动生成的 在程序的运行当中,如果我们希望程序能够自己创建工具栏和按钮,可以在CDR启动事件中设置一个检测功能 Private Sub GlobalMacroSt ...
- CorelDRAWX4的C++插件开发(三十八)纯C++插件开发(2)导入tlb编译文件
上一节文件建立好了之后,我们把Debug模式改成X86,如果找不到的话,可以在视图-工具栏-标准找到这个界面,因为X4不支持64位的,所以我们只能让他在32位的环境中进行编译调试 然后我们点开顶部项目 ...
- CorelDRAWX4的VBA插件开发(四十四)建立类(1)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线
这次主要来浅讲一下"类"这个功能,先上一下要实现的功能,建立设计外框加出血线和等分折页线,先上图 那什么是类呢?类其实就是CLASS,用来封装成员参数和函数的,拆开来里面就是这些东 ...
最新文章
- Docker 容器技术 — Dockerfile
- matlab mat文件
- linux共享文件可读写,在Ubuntu中设置samba共享可读写文件夹
- python从零开始基础入门——开发环境搭建
- Redis的安装及原理介绍
- Linux 的camera sensor 驱动代码分析:基于rv1108
- 计算一个3位数各个位数之和
- asdfasdfasdf
- 教你win7去除快捷方式小箭头方法
- 怎么把PDF转换成图片?教大家两种方式转换
- cada0图纸框_CAD的图框应该怎么画-百度经验
- C语言popcount函数,C/C++中__builtin_popcount()的使用及原理
- linux c语言 cmos,c语言编写程序读写CMOS内容
- 网易2016招聘笔试升级之路Java代码
- 互联网开发模式的经验之谈
- python3攻击服务器_Python服务器用套接字互相攻击
- 再来一个小游戏——原生js逐句解释开发简易版别踩白块,附源码
- 卡尔曼滤波与组合导航原理_基于RAEKF的GPS/INS紧组合导航方法研究
- 数据预处理Part9——数据降维
- 百褶裙怎么画?怎样才能画好女生百褶裙?
热门文章
- ESXI定时关机脚本
- mysql id问题_关于MySQL自增ID的一些小问题总结
- 你对Google了解多少?
- CString之Find()、FindOneOf()、ReverseFind()
- 会议室919、920、1897
- 福布斯:加密货币正准备从根本上改变金融
- 炒股程序化交易接口C++API技术特点
- java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with UUID……
- 【安卓开发】安卓页面跳转
- 蓝牙耳机什么牌子好?国产蓝牙耳机最好的牌子推荐