• 上一节没有讲到的递归函数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节)递归调用框选工具相关推荐

  1. CorelDRAWX4的VBA插件开发(三十四)调用C++实现一键智能群组(第3节)主调函数以及三个被调函数

    这一节就进入到了群组的实质性的内容,先把群组Qunzu()函数展示一下 先展示主调函数Qunzu(),函数里面还有四个被调函数等会儿再说 BOOL Qunzu() {//undo开 这个是一键多步撤销 ...

  2. CorelDRAWX4的VBA插件开发(二十五)多类目选择实现复合框内容置换

    有时候我们的复合框内的内容是有更多的需求,但是我们又不想另开一个窗口,怎么办呢,我们直接使用复合框内容替换就行啦 先上效果图: 先在面第板上拉出一个框架, 再在里面添加上三个选项按钮, 添加好之后这三 ...

  3. CorelDRAWX4的VBA插件开发(四十五)建立类(2)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线

    在上一节中已经建立好了类,那么这一节我们来调用它,先建立一个面板 然后修改框体名称 然后从左侧新建一些按钮并且以拼音为结尾进行命名 Private Sub CheckBox2_zheYe_Click( ...

  4. CorelDRAWX4的C++插件开发(三十九)纯C++插件开发(3)声明变量并暴露导出函数

    接上一节我们接下来声明一些需要用到的变量 // 声明CorelDRAW变量=VBA::Application类 VGCore::IVGApplication* corelApp = NULL; //声 ...

  5. CorelDRAWX4的VBA插件开发(三十一)使用C++制作动态连接库DLL辅助VBA构键强大功能-(5)在VBA中动态调用DLL文件

    我们先来看一下动态调用的截图 先上代码 '静态调用 Public Declare Function wodedll Lib "E:\VS-DLL\conglingkaishi\Debug\C ...

  6. CorelDRAWX4的VBA插件开发(二十四)复合选框组件与联合命名面板

    我们在处理文档的时候碰上的最多的问题就是与字符串相当的问题,这里再拿出来单把各种使用命名的小组件讲一下,我们先上效果图: 我们可以在上图看到最终结果,可以让一行文件名跟随各种组件进行更改,下下面我们先 ...

  7. CorelDRAWX4的VBA插件开发(四十六)VBA插入启动事件让CDR启动时检测并自动添加工具栏和按钮

    先上结果图,这个工具栏和按钮都是主程序自动生成的 在程序的运行当中,如果我们希望程序能够自己创建工具栏和按钮,可以在CDR启动事件中设置一个检测功能 Private Sub GlobalMacroSt ...

  8. CorelDRAWX4的C++插件开发(三十八)纯C++插件开发(2)导入tlb编译文件

    上一节文件建立好了之后,我们把Debug模式改成X86,如果找不到的话,可以在视图-工具栏-标准找到这个界面,因为X4不支持64位的,所以我们只能让他在32位的环境中进行编译调试 然后我们点开顶部项目 ...

  9. CorelDRAWX4的VBA插件开发(四十四)建立类(1)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线

    这次主要来浅讲一下"类"这个功能,先上一下要实现的功能,建立设计外框加出血线和等分折页线,先上图 那什么是类呢?类其实就是CLASS,用来封装成员参数和函数的,拆开来里面就是这些东 ...

最新文章

  1. Docker 容器技术 — Dockerfile
  2. matlab mat文件
  3. linux共享文件可读写,在Ubuntu中设置samba共享可读写文件夹
  4. python从零开始基础入门——开发环境搭建
  5. Redis的安装及原理介绍
  6. Linux 的camera sensor 驱动代码分析:基于rv1108
  7. 计算一个3位数各个位数之和
  8. asdfasdfasdf
  9. 教你win7去除快捷方式小箭头方法
  10. 怎么把PDF转换成图片?教大家两种方式转换
  11. cada0图纸框_CAD的图框应该怎么画-百度经验
  12. C语言popcount函数,C/C++中__builtin_popcount()的使用及原理
  13. linux c语言 cmos,c语言编写程序读写CMOS内容
  14. 网易2016招聘笔试升级之路Java代码
  15. 互联网开发模式的经验之谈
  16. python3攻击服务器_Python服务器用套接字互相攻击
  17. 再来一个小游戏——原生js逐句解释开发简易版别踩白块,附源码
  18. 卡尔曼滤波与组合导航原理_基于RAEKF的GPS/INS紧组合导航方法研究
  19. 数据预处理Part9——数据降维
  20. 百褶裙怎么画?怎样才能画好女生百褶裙?

热门文章

  1. ESXI定时关机脚本
  2. mysql id问题_关于MySQL自增ID的一些小问题总结
  3. 你对Google了解多少?
  4. CString之Find()、FindOneOf()、ReverseFind()
  5. 会议室919、920、1897
  6. 福布斯:加密货币正准备从根本上改变金融
  7. 炒股程序化交易接口C++API技术特点
  8. java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with UUID……
  9. 【安卓开发】安卓页面跳转
  10. 蓝牙耳机什么牌子好?国产蓝牙耳机最好的牌子推荐