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

如何获取CEdit控件的真实行数以按需显示垂直滚动条

CEdit控件按需显示垂直滚动条的解决方案

当你的CEdit控件设置了ES_MULTILINE且关闭了水平滚动条(未启用ES_AUTOHSCROLL)时,文本会自动换行,但CEdit::GetLineCount()只会统计带手动换行符的行数,无法反映自动换行后的实际总行数,因此不能用行数×行高的方式计算文本总高度。以下是两种可靠的判断方法:

方法一:计算文本自动换行后的实际总高度

通过控件的文本显示区域宽度,结合文本绘制函数计算实际占用高度,再和控件客户区高度对比:

  1. 获取文本显示区域的可用宽度:
    RECT textRect;
    m_yourEdit.SendMessage(EM_GETRECT, 0, (LPARAM)&textRect);
    int usableWidth = textRect.right - textRect.left;
    
  2. 绑定控件的字体到设备上下文,保证计算精度:
    CDC* pDC = m_yourEdit.GetDC();
    CFont* pOldFont = pDC->SelectObject(m_yourEdit.GetFont());
    
  3. 用DrawText计算文本在指定宽度下的总高度:
    CString content;
    m_yourEdit.GetWindowText(content);
    RECT calcRect = {0, 0, usableWidth, 0};
    // DT_CALCRECT 仅计算高度,DT_WORDBREAK 启用自动换行,DT_EDITCONTROL 匹配编辑控件的换行规则
    pDC->DrawText(content, &calcRect, DT_CALCRECT | DT_WORDBREAK | DT_EDITCONTROL);
    int totalTextHeight = calcRect.bottom - calcRect.top;
    
  4. 恢复设备上下文并释放资源:
    pDC->SelectObject(pOldFont);
    m_yourEdit.ReleaseDC(pDC);
    
  5. 对比高度并调整滚动条:
    RECT clientRect;
    m_yourEdit.GetClientRect(&clientRect);
    int clientHeight = clientRect.bottom - clientRect.top;
    
    if (totalTextHeight > clientHeight) {
        m_yourEdit.ModifyStyle(0, WS_VSCROLL);
    } else {
        m_yourEdit.ModifyStyle(WS_VSCROLL, 0);
    }
    

方法二:通过滚动条状态判断(适合已启用滚动条的场景)

如果控件默认带有WS_VSCROLL样式,可以用EM_GETTHUMB消息获取滚动块位置,若返回值大于0,说明文本超出控件范围:

int thumbPosition = m_yourEdit.SendMessage(EM_GETTHUMB, 0, 0);
if (thumbPosition > 0) {
    // 文本超出,保持滚动条显示
} else {
    // 文本未超出,隐藏滚动条
}

关键注意点

  • 确保控件样式正确:必须启用ES_MULTILINE,同时禁用ES_AUTOHSCROLL,否则文本不会自动换行,只会横向滚动。
  • 文本更新、控件大小改变时,需要重新执行上述判断逻辑,保证滚动条状态实时正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:21:20