您的位置:首页 > 其它

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

2011-09-02 09:52 375 查看
一般来说,如果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);

即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: