【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);
即可。
(对于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);
即可。
相关文章推荐
- 关于华为手机使用高德地图无法定位的问题
- 关于VC6.0 MFC+ATL做出的COM,其内部的windows窗口不能以XP Theme模式显示的问题彻底解决
- 关于如何在MFC内实现雪花动画的几个问题
- 关于contextMenuStrip控件的定位问题
- MFC 关于自动更新问题的解决方案和代码
- CSS中关于定位的问题, 相对,绝对定位
- 关于多文档MFC从xp系统上移植到win7上出现错误的问题解决经验
- 关于"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"的解决方案
- MFC 关于绝对路径问题的一点总结
- 关于百度地图iOS8的定位问题以及iPhone6 Plus黑框
- 关于相对定位、绝对定位在ie6下bug的三个问题
- 深入浅出MFC 第8章 关于序列化(Serialize)的一些问题
- 关于MFC中list控件的问题
- 关于背景图片上打标签定位的问题
- 关于robotframework,app,appium的xpath定位问题及常用方法
- iOS AppStore 审核驳回 关于 UIBackgroundModes 定位问题
- 关于安卓中国移动定制机GPS定位问题解决办法
- Selenium关于滚动条的定位方法总结
- 关于VS中MFC中CString转char *的问题
- 关于ublox接收机在周日上午不定位(复位重启)问题的解决办法