RichEdit打造完美语法着色器

由于不需要显示Outline内容,使用RichEdit来制作语法着色器成为大多数人的首选。但这中间也有很多问题需要一个一个的解决:

1、解决闪烁
使用LockWindowUpdate是不能完好解决这个问题的,必须用SetRedraw。

2、处理Tab键
缺省的Tab键处理不会在编辑框中插入/t,有人使用PreTranslateMessage来截获WM_KEYDOWN。这个方法可行。我使用的方法是重载OnGetDlgCode返回DLGC_WANTALLKEYS。

3、自动缩进
PreTranslateMessage来截获WM_KEYDOWN,如果是输入回车键则把当前行的行首空白段(包括/t和空格)加上一个回车换行输入到编辑框中。

4、显示行号
先用EM_SETMARGINS消息在左边设置一块空白区域用于显示行号,然后SetWindowLong指定新的窗口循环。在新的窗口循环里面截获WM_PAINT消息,先用旧的处理函数显示除了行号区域以外的内容,然后调用一个自定义函数画出行号区域。
在画行号区域的时候,有几个地方需要注意。一是CDC::SelectClipRgn设置裁剪,不然会把行号画到边框上去。二是用PosFromChar得到行的位置,这样就能完美的配合滚动条,在第一个可见行只有一半可见的时候也不会有任何问题。
另外,如果要把当前行bold显示,需要处理一些鼠标消息和按键消息以重画行号区域。

5、语法分析
语法分析的时候主要是要注意一个问题:行结束符。RichEdit的SetSel函数把行结束当做一个字符(/r),但你用GetWindowText得到的行结束却是两个字符/r/n。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值