You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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手动控制选中范围

如果不想修改断字规则,也可以直接拦截双击消息手动计算选中范围:

  1. 用EM_CHARFROMPOS获取双击位置对应的字符索引;
  2. 从该索引向前后遍历,将字母、数字和下划线视为单词组成部分,确定完整的单词起始和结束位置;
  3. 调用EM_SETSEL设置最终的选中范围。

关于EM_FINDWORKBREAK:它本质是调用当前的单词断字逻辑查找边界,主要用于自动换行场景。如果没有自定义断字函数,它会沿用默认规则,无法解决你的问题;但如果已经设置了自定义断字函数,它可以辅助你快速查找边界,但核心还是依赖自定义的断字规则。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:35:14