1、TrackMouseEvent请使用_TrackMouseEvent2).在 commctrl.h 显示为_TrackMouseEvent(),请注意下划线.3).可能 TrackMouseEvent()不支持 Win98(在 NT 中工作得非常好),建议你结合WM_MOUSEMOVE 消息和 SetCapture()函数,当鼠标移出窗口时你依然可以控制.Turbo C 修改 Auto CAD 的图素Auto CAD 是一套高效的绘图工具,在地图制图和计算机辅助设计方面得到广泛的应用。地籍图的数字化和编辑中,常会遇到图形的放大和缩小等情况,而其中的部分图素则要求保持原样,如界址点的园圈要求无论
2、在何种比例尺地籍图中其半径均为0.4mm,注记也必须满足规范要求。如何在图形比例变化后,复原部分图素的大小,是地籍制图工作中非常重要的问题。本文讨论运用 Turbo C 语言直接读写 Auto CAD 的数据交换文件并修改其部分图素的方法。Auto CAD 图形数据库是以十分紧缩的格式存储的,对用户程序来说,很难直接读出,为便于数据交换,Auto CAD 提供了数据交换文件DXF 文件。?此文件是一种专用的 ASCII 文件,其一般结构为:HEADER(标题)节、?TABLES?(表格)节、BLOCK(块)节、ENTITIES(图素)节、EOF(文件结束)节,共五个部分。每个部分由若干组构成,
3、每个组由两行组成,首行为组代码,其格式为三个字符域向右对齐,左边填满空格,该组的第二行是组值,采用的格式取决于由组代码规定的组的类型。部分组代码及其含义:0 标识一个图素表目的开始;1 一个图素的初始文本值;6 线型名;8 层次名;10起始 X 坐标(线或正文图素的起始点,园的园心,等等);11-18其它 X 坐标;20起始 Y 坐标(线或正文图素的起始点,园的园心,等等);21-28其它 Y 坐标;30-38Z 坐标;40-48浮点值(如文字高度、比例因子等);50-58角度;62颜色号。70-78整数值(如文本注记方式等)DXF 文件各个节的代码及顺序为:0 (开始标题节) 0 (开始图素
4、节) SECTION SECTION 2 2 HEADER ENTITIES . . (图素部分) 0 (开始表节) 0 (终止图素) SECTOIN ENDSEC 2 0 (文件结束节) TABLES EOF (文件结束) . 0 (开始块节) SECTION 2 BLOCKS 每个图素从标识图素的 0 开始,分别为图素名、层次组码、层次名等,部分图素的组代码为:LINE 10 和 20(起始点),11 和 21(终止点)。POINT 10 和 20。CIRCLE 10 和 20(园心),40(半径)。ARC 10 和 20(园心),40(半径),50(起始角度),51(终止角度)。TEXT
5、 10 和 20(插入点),40(高度),1(文字值),50(旋转角度,可选项),41(X 的比例因子,可选项),51(倾斜角,可选项),72(对齐类型,可选项),等。.以上图素均有颜色可选项,若用系统颜色,则此项省略,否则,有组码 62 和组值(即所用的颜色值)。以部分图素为例,其在 DXF 文件中的结构为:0 (图素开始) 11 TEXT 31.877698 (终点 X 值) 8 21 0 (0 层) 24.488029 (终点 Y 值) 62 31 1 (1 号颜色) 0.0 (终点 Z 值) 10 0 14.419423 (插入点 X 值) CIRCLE 20 8 29.015994
6、(插入点 Y 值) 0 (0 层) 30 10 0.0 (插入点 Z 值) 21.021801 (园心 X 值) 40 20 2.0 (文本高度) 14.931725 (园心 Y 值) 1 30 asdasf (文本值) 0.0 (园心 Z 值) 50 40 10.0 (旋转角度值) 2.993616 (半径 R 值) 72 0 1 (对齐方式) ARC 11 8 20.0 (对齐点 X 值) 0 21 10 30.0 (对齐点 Y 值) 40.578556 (中心 X 值) 31 20 0.0 (对齐点 Z 值) 16.275509 (中心 Y 值) 0 30 LINE 0.0 (中心 Z
7、值) 8 40 0 (0 层) 6.505316 (半径 R 值) 62 50 3 (三号颜色) 54.138194 (起点角度值) 10 51 24.333769 (起点 X 值) 176.45641 (终点角度值) 20 25.039355 (起点 Y 值) 30 0.0 (起点 Z 值) 以修改 CIRCLE 的半径和 TEXT 的高度为例。由于大部分图素有可选项,数据结构不固定,因此难以用 Turbo C 的结构体进行读写。另外,DXF 文件的组码不是左对齐,也无法按整型数据读取。Turbo C 提供了两个函数:fgets(str,n,fp)和 fputs(str,fp)。前者是从 f
8、p 指向的文件输入 n-1 个字符,并把它们放到字符数组str 中。若在读入 n-1 个字符结束之前遇到换行符或 EOF 读入结束。后者是把 str 中的字符输入到 fp 指向的文件中。设图素的可选项均为系统默认值,源程序如下:/*修改 DXF 文件中的园的半径和 TEXT 的高度*/#include “stdio.h“FILE *fp,*fp0;main()char s140,s240,s340,*ss;int i;char outfile12;printf(“输入 DXF 文件名(含扩展名): “);scanf(“%s“,outfile);if (fp=fopen(outfile,“r“)
9、=NULL)printf(“can not open filen“);exit(0);if (fp0=fopen(“dxf0.dxf“,“w“)=NULL)printf(“error!n“);exit(0);while (! feof(fp)fgets(s1,20,fp);fputs(s1,fp0);if (s10=Ci=9;i+) fgets(s1,20,fp);fputs(s1,fp0);fgets(s1,20,fp);fputs(“1.4n“,fp0);if (s10=Ti=11;i+) fgets(s1,20,fp);fputs(s1,fp0);fgets(s1,20,fp);fputs(“2.0n“,fp0);fclose(fp);fclose(fp0);运行此程序即可将园的半径均修改为 0.4,将文本注记的高度均修改为 2.0,修改的结果保存到 DXF0.DXF 中,在 Auto CAD 状态下用 DXFIN?命令即可调出修改后的图形。当可选项为非默认值时,读者可仿照此方法,设计相应的子函数,通过组码及其值的判断完成相应图素的修改。也可以实现交互式编辑。此方法在地籍制图的实际工作中,已得到应用,并收到良好的效果,特别在批量修改方面,其优点更为突出。参考文献1 谭浩强编著,C 程序设计,清华大学出版社,1991 年