Caxa 二次开发源代码 1 #include "stdafx.h" #include "eb_api.h" // CAXA EB API 函数 #include "resource.h" void dymGenTwoPtLine1(int& step,int& flag); // 两点线方法1 void dymGenTwoPtLine2(int& step,int& flag); // 两点线方法2 int usrAppendDraw(int& step,int& flag) { AFX_MANAGE_STATE(AfxGetStaticModuleState()) static int choice=0; // 注意这里一定要用静态(static)来声明用于纪录选择结果的变量!!! if(step==0) // 第一步 { ebClearMenu(); // 清理立即菜单区 ebGetMenuChoiceBrk("两点线(方法1)@两点线(方法2)",&choice); // 弹出立即菜单项 ebRegisterPopMenu(); // 登记工具点菜单 } // 根据选择要绘制线的类型来执行相应的函数 switch(choice) { case 0: dymGenTwoPtLine1(step,flag); break; case 1: dymGenTwoPtLine2(step,flag); break; default: break; } return RT_NORMAL; } /* 用第一种方法绘制两点线,这种方法是建立临时直线节点,通过绘制 结点的办法来实现拖动效果,使用这种方法具有一定的通用性,可推 广到绘制块、箭头、文字等复杂图形,但要特别注意的一点是,为了 避免内存泄漏,当绘制完成或取消操作时应该及时使用ebFreeNode 函 数释放掉临时结点,这点非常重要!!! Caxa 二次开发源代码 2 */ void dymGenTwoPtLine1(int &step,int &flag) { static EB_POINT p1,p2; // 注意: 这些在消息循环过程中要发生 static int continues=0; // 变化的量应采用静态声明 static int maner=0; static int style=0; static double len = 100.0; int ret = 0; int ret1 = 0,ret2 = 0; static EB_NODE line=NULL; // 临时直线,该直线用于中间过程的操作 if(line==NULL) line=ebBuildLine(p1,p2); // 如果临时直线还没有创建则先创建一条直线 else ebSetLineData(line,p1,p2); // 如果临时直线已经创建则根据两端点修改该直线直线 // 以下的代码是为了实现绘制时的拖动效果, if(flag == ERASE_TRACE) // 如果当前绘图标志为擦除时 { ebDrawXOR(TRUE); // 打开异或绘图方式 ebDrawNode(line); // 绘制一遍直线 ebFirstFlag=TRUE; // 置首次绘制标志为真 ebDrawXOR(FALSE); // 关闭异或绘图方式 return; } if(flag == UPDATE_TRACE) // 如果当前绘图标志...