如何修改RichEdit控件选词规则:将下划线视为单词组成部分
RichEdit控件双击带下划线内容的选中问题解决方案
RichEdit默认会把下划线当作单词边界,所以双击ABC_DEF_123里的E只会选中DEF。没有现成的简单开关能修改这个默认行为,但有两种可靠的处理方式:
1. 自定义单词断字函数(推荐)
通过EM_SETWORDBREAKPROC消息给RichEdit设置自定义的单词断字回调,让控件将下划线判定为单词的一部分,这样默认的双击选中逻辑会自动选中完整的目标字符串。
示例实现大致如下:
int CALLBACK CustomWordBreakProc(LPCWSTR lpch, int ichCurrent, int cch, int code) { switch(code) { case WB_ISDELIMITER: // 将下划线排除在分隔符之外 return (lpch[ichCurrent] == L'_') ? 0 : IsCharAlphaNumericW(lpch[ichCurrent]) ? 0 : 1; case WB_LEFT: case WB_RIGHT: // 自定义左右边界查找逻辑,把下划线和字母、数字归为同一类 // 这里可以参考系统默认断字逻辑,调整对下划线的处理 // 比如向左查找时,持续跳过字母、数字和下划线,直到遇到其他字符 // 向右查找同理 break; } // 其他场景委托给系统默认断字函数 return DefaultWordBreakProc(lpch, ichCurrent, cch, code); }
在RichEdit初始化完成后,发送消息应用这个回调:
SendMessage(hwndRichEdit, EM_SETWORDBREAKPROC, 0, (LPARAM)CustomWordBreakProc);
这种方式无需拦截双击消息,控件自带的选中逻辑会自动遵循你定义的规则,是更优雅的实现方式。
2. 拦截WM_LBUTTONDBLCLK手动控制选中范围
如果不想修改断字规则,也可以直接拦截双击消息手动计算选中范围:
- 用
EM_CHARFROMPOS获取双击位置对应的字符索引; - 从该索引向前后遍历,将字母、数字和下划线视为单词组成部分,确定完整的单词起始和结束位置;
- 调用
EM_SETSEL设置最终的选中范围。
关于EM_FINDWORKBREAK:它本质是调用当前的单词断字逻辑查找边界,主要用于自动换行场景。如果没有自定义断字函数,它会沿用默认规则,无法解决你的问题;但如果已经设置了自定义断字函数,它可以辅助你快速查找边界,但核心还是依赖自定义的断字规则。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

