关于类似RichEdit控件的设计思想

这个控件设计之初是为了实现类似QQ的输入框的功能。要求能够自动换行,允许输入汉字及数字,能够点击屏幕确定点在某个字符之前或之后,总之,行为上类似于一个richedit控件,当然,可以指定某段的颜色(以/r/n结尾为一个自然段),可以在行中插入小图标,比如笑脸什么的,就像QQ的输入框一样。

根据以上的需求,可以简单设计一个结构用以标识段:

struct SSectInfo            //段信息,以L"/r/n"标示一段结束
{
    TCHAR    *m_pszSect;        
    int        m_nLength;        
    int        m_nMax;          
    COLORREF m_color;  

};

对于输入框,我们通常做的动作为:

1、点击输入框,确定输入起始位置

2、在起始位置输入文字(插入)

3、在起始位置删除前一个位置的文字

4、在起始位置删除当前位置的文字

5、在起始位置,按下右键,向右移动,从起始位置开始向后选中某几行文字

6、在起始位置,按下右键,向左移动,从起始位置开始向前选中某几行文字/

7、替换选中的文字。

7、在起始位置删除前一个位置的文字

8、在起始位置删除当前位置的文字

9、点击输入框中其它位置,改变起始位置

10、通过按上下左右键或是pgup,pgdn,home,end等,改变起始位置

11、按tab键,增加tab值,并改变起始位置。

 

针对前述的原始需求,逐一分析,产生原始的设计思路。

 

直接写设计思路:

根据前面试写的代码,发现不能以段作为索引,因为以段作为索引对于定位数据会存在很多不直观的思维。

1、以行作为索引的想法,点击屏幕,算出行,加上前面的行索引,即为内存中的行。然后在内存中增加数据,则相应的此段中其它的行要有所变动,若删除此行中的数据,同样此段中其它行有所变动。

2、移动上下左右,pgup,pgdn,home,end键,上下键,移向上一行或下一行,左右键,移向一行中的上一个或是下一个,若左边结束,则移向上一行末,若右边结束,则移向下一行初

3、保留行与段的对应查找,保留的目的是当发生宽度变化时,根据原始的位置可以定位到当时显示的字符那儿,其它均应以内存行作为标准。

4、在某行中添加字符串时,若发现总长度大于段的长度时,需要后台自动进行内在扩充,但此过程是自动完成,不影响行的概念。

5、内存行与屏幕行的关系,完全一一对应,并且根据不同的宽度,有不同的内存行。段与内存行的关系,段中有若干内存行,并且是在读取数据的过程中动态生成的。

根据前述思路,假设有如下数据:

“2323232342332好好的,这样,那样,好不好?3333大于段的长度时”

这是一段,如果在手机中显示如下:

2323232342332好好的,

这样,那样,好不好?333

3大于段的长度时

则内存行中为3行,第一行开头为”2”,17个字符,第二行开头为”这“,13个字符,第三行开头为”3“,8个字符

若选中问号,相当于选中第2行第10个字符,在里面插入字符时,第2行的长度需要重新计算,后面相关的长度与开始也需要调整。

6、关于行的计算过程

先按最简单的方式进行计算,总是从头开始,即一旦发生宽度发生变化,即开始从头开始计算每段的行数,一直算到最后一行。

而对于插入,修改,删除的过程,只计算牵涉到的段,并且从段中的某行开始。

当发生窗体宽度变化,则topline也要跟着发生变化,

另外,当屏高度发生变化,应该首先保证选中部分可视,需要调整首行的索引。

  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值