我想写一个类似"记事本"的程序,但不想用MFC提供的CEdit,
不知道怎么自己实现一个类似CEdit的控件,最主要的是显示速度.
我直接用DrawText画文本时,当移动滚动条时速度很慢,占用CPU很高.我想知道CEdit这样的控件实现的原理是怎么样的,比如加载文本时先计算什么,
当移动滚动条时要计算什么.当选择文本时怎么快速把选中的文本高亮显示?希望高手指点下,要详细点说哦,如果有现成的代码最好,谢谢.

解决方案 »

  1.   

    即使使用TextOut一个字符一个字符输出也能达到足够满意的速度。关键在于处理刷新的时候局部刷新和使用双缓冲。比如滚动,用ScrollWindow滚动界面,只需要刷新新滚动出现的小部分界面就可以了。
      

  2.   

    如果要实现"自动换行",就是当一行字符太长时自动分行显示该怎么处理?我看记事本当选中自动换行后改变大小时如果里面的文本很多是需要些时间重绘的,
    它应该是在改变大小时计算机哪个字符在第几行的吧.怎么快速各行要显示的字符?比如一个字符串:
    abcdefghijklmnopqrstuvwxyz
    一行最多只能显示10个(有些字符宽点可能就显示不了10个了)
    abcdefghij
    klmnopqrst
    uvwxyz我是不是要遍历所有字符,计算每个字符的宽度然后确定第一行要显示几个字符?
    有没快点的方法?或直接有函数可以用?
      

  3.   

    其实文字处理不是傻傻地,有很多技巧,比如英文有分词问题,中文都是等宽的等。如果你说一行很长的英文字母的分行,那么也不用一个字母一个字母遍历,可以根据差距优化,类似查找算法,比如折半;而GDI提供的计算字符串长度的函数可以简化字符串宽度的计算,比如GetTextExtent等。