【MFC】关于EditBox中滚动条定位问题

本文介绍了一种在EditBox中动态更新内容时保持滚动条位置不变的方法。通过记录滚动条位置,在内容更新后恢复该位置,实现了滚动条的稳定显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   一般来说,如果EditBox中的内容是静态的,那么可以根据属性很容易地滑动滚动条。
   (对于Dialog 来说可以设置其属性)
    但是,如果EditBox中的内容是动态刷新的,那么每一次refresh后,滚动条(无论是水
平的,还是垂直的)都会重新定位在开始的位置。
    所以,如果想要让每次刷新时,滚动条的位置保留不动,那么就需要作些处理。
-------------------------------------------------------------------------
例如:
//计时器,让它每隔一定时间就刷新一次EditBox中的内容。
void XXX::OnTimer(UINT_PTR nIDEvent)
{
        //设定要输出的内容
       CString str;
       m_str +="Line ==";
       m_nLineCount++;
       str.Format( "%4d", m_nLineCount );
       m_str += str + "==";
       m_str +="01234567890123456789012345678901234567890123456789\r\n";
 
       //获取刷新前,水平滚动条和垂直滚动条的位置
       m_position.x = m_edit1.GetScrollPos( SB_HORZ ); 
       m_position.y = m_edit1.GetScrollPos( SB_VERT );
 
       //获取水平滚动条的滚动范围
       m_edit.GetScrollRange( SB_HORZ, &m_nMinHScroll , &m_nMaxHScroll );
       m_flag++;
       if( m_flag == 1 )
       {
                //获取第一行字符个数
                maxLen = m_str.GetLength();
       }
 
       //刷新EditBox中的内容
       m_edit.SetWindowTextA( m_str );
      //设定水平和垂直滚动条的位置(刷新前的位置)
      if( m_nMaxHScroll != m_nMinHScroll )
      {
                //这步换算直接影响到是否能定位水平滚动条刷新前的位置
                int nChar = ( maxLen * m_position.x ) / (m_nMaxHScroll - m_nMinHScroll);
                m_edit1.LineScroll( m_position.y, nChar );
      }
      else
     {
                m_edit1.LineScroll( m_position.y );
     }
     CDialog::OnTimer(nIDEvent);
}
----------------------------------------------------------------------------
    简单说明一下,由于CEditBox::LineScroll()函数是可以设置滚动内容的,但是由于其第2
个参数(一般情况下是缺省的)要求传入的是字符个数,即:将要水平滚动的字符个数,所以要
进行一下换算:
    nChar = ( maxLen * m_position.x ) / (m_nMaxHScroll - m_nMinHScroll);
即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值