关于类似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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值