楼主: |
终于成功地做出了一个简单的插图功能,再加上对响应选取操作的算法改进,和对整个结构的优化,终于做出了一个称得上具有实用性的文本核心了。
目前插图功能还不完善,只能插入在行后,而且一行只能够插入一张图片,但是可以设置插图尺寸和对齐方式。增加了对西文单词的识别用以配合两端对齐和花体字母。
这里是源代码和演示程序的位置 由于这一次算是具有真正实用性的了(除了还不支持滚动条,其他的都还算好),所以玄虚决定顺便发布一份简要的接口使用说明。保存和读取的功能会等到结构确定之后加入其中,有兴趣的可以自己试下,也不算麻烦。
需要使用的类只是TElPassage类。下面是可用的属性和方法。
属性部分: SelImage:Boolean,是否选中图片,只读属性。 Left:Single,类在窗口上的打印坐标。 Top:Single,坐标。 Width:Single,类的限制宽度。 Height:Single,只读属性,类的高度,由画图过程确定。 ParaIndex:Integer,当前所在的段落索引值。不推荐更改,但是可以这么做。 SelStruct:TsctUI,交互所用的格式信息。可以直接更改文字属性和段落属性还有插图属性,暂时还不支持同时修改多段的段落属性。 SelStart:Integer,选取开始位置,从0开始,每一段段末到下一段段首数值加一。 SelLength:Integer,选取长度,用来确定框选。 TextLength:Integer,总的字符数,这里没有加入对西文的识别。 Paras[Index:Integer]:string,每一段的纯文本。
方法部分 constructorCreate(Left, Top, Width: Single; ACanvas: TCanvas; ASelRec: TRectangle); 创建,需要提供用来绘制的Canvas,和用来作为光标的Rectangle。暂时还没有找到更好实现光标的方法。
destructorDestroy; override; 删除,没什么好说的。
procedureDrawToMap(Index: Integer); 将段落绘制到图像上,并获取必要信息。值得注意的是,如果一个段落从来没有被绘制过,或者修改了但是没有绘制,是很容易出问题的。但是一般外部操作不需要考虑这个问题,常用的外部操作都会自动附加这个操作。
procedure DrawPassage; 直接绘制全段落图像,这里不会修改段落的内容,只是绘制而已,如果没有执行绘制到图像这一步骤,这里不会得到刷新。
procedureDrawFromPara(Index: Integer); 绘制当前段落及之后的图像,这里也不会提供刷新。
procedureDrawParaWithoutChange(IFrom: Integer; ITo: Integer = -1); 直接绘制该段落图像,如果不填入ITo,则默认单段落,不提供刷新。
procedureInsertChar(AChar: Char); 在当前位置插入一个字符,响应输入的操作,自动删除已选取内容。
procedureInsertImage(FileName: string; Width: Single); 插图,需要设置宽度,如果设置为0则为图像宽度。所有的宽度都不会超过图像本身的宽度或限制宽度。
procedureDeleteChar; 当前位置删除一个字符
procedureDividePara; 在当前位置分段分段是为了响应回车,与插入字符并不相同。
procedureSetSelection(const P1, P2: Integer); 由两处选取位置获得选取开始及长度,只需要输入两处对应的选取开始位置即可,不需要考虑大小顺序。
functionSelect(X, Y: Single; Moving: Boolean = False): Integer; 由绝对坐标获取选取位置,后一个参数是在移动的时候将忽略选取图片的行为,只考虑框选。
此帖子包含附件:
大小:152.9K |
----------------------------------------------
--O, ye Magnificient Deity's Miracle! --I'm yet Reniastyc de El Magnifico. |