注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

RichEdit打造语法着色器 SetSel函数把行结束当做一个字符(\r),  

2014-07-17 22:41:13|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
RichEdit打造语法着色器
2010-06-21  来自:CSDN  字体大小:【大 中 小】
摘要:由于不需要显示Outline内容,使用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。

  评论这张
 
阅读(229)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017