> 不需要复杂算法吧。 > 这玩意要什么算法,需要的就是慢功夫,慢慢磨. 也许我用“算法”这个词没有正确的表达我的意思。 总之就是我实际在实现这个控件时,觉得有点无法完全掌控, 希望有些技巧(模式?数据结构?其他特殊方法、经验?),最终能够解决这些无法完全掌控的问题。 起初也不觉得太难,实际设计后,光下面这个问题就让我不知如何是好: 假设场景:在一个长达8页(暂时不考虑800页)的内容中, 1.用户在第1页第一段某处按了一下回车 回车造成第1页第1段分成2段,于是原本第2段以后位置,全部向下挤。 (这部份不论我怎么调整修改,始终有闪烁或画面刷新不乾净现象。 即便我已用了BeginUpdate, EndUpdate的技巧,使用户一个动作只会发生1次“从必须处开始刷新”, 还是稍微有闪烁;或者是类似闪烁,总之就是刷新得不乾净利落导致眼睛看起来画面脏脏的感觉) (大家都知道,一段里有n行,总共有m字,假设n大约10,m大约400;当原本第2段开始往下移, 最笨的方法就是从那一段开始,每一行每个字都重新刷新一次; 这种方式我实现过一次, 可能因为每一次字都要从相对位置计算相对于控件的绝对位置,显示时既慢又不舒服; 后来的做法是,段落内容每一次用bitmap记住, 段落移动时,重新在绝对位置paint bitmap一次, 这么做后感觉好了很多,但仍不太好, 而且缺点是,用户在用鼠标选择n个字导致那n个字必须显示被选择的底色时,bitmap的存在会导致其不会立即刷新, 因此bitmap的使用得区分时机点) 2.用户在第1行第1段某处连续快速地输入n个字,此时该段文字要像祖玛游戏那样,快速地向后向下流动, 当然,因此新增一行,又会发生像第1个问题一样的“后续段落位置下挤刷新”的问题; (看著祖玛,就会想它怎么实现的?想到的一个方法是用TGraphpicControl来画每个球 TGraphicControl又是怎么确保它移动一次位置,整个Canvas只刷新一次呢? 我因为不确定使用TGraphicControl是否能在鼠标选择n个字时正确地将鼠标动作传送给底层Control, 因此一直没使用TGraphicControl实现) 3.Replace时,如何快速取代内容且刷新乾净呢? 总之,就是这些看似简单、但我一直没有乾净利落地处理(当然同时还要保证代码也要乾净利落好维护)的琐碎问题, 不再详述。 网上查过Chrome核心的Layout概念,但它没有用户编辑内容的功能,似乎无法借鉴。 不知道有没有高手们怎么处理这方面问题的经验讨论或说明呢? 光Composite模式和迭代子模式不够啊。 谢谢suiyunonghen,有空会看一下WPTools和RichView代码。
5,388
社区成员
262,729
社区内容
加载中
试试用AI创作助手写篇文章吧