关于滚动条
来源:互联网 发布:windows server 97 编辑:程序博客网 时间:2024/06/05 19:14
最近在做个MFC应用程序,学了不少东西,把学到的写下来,一是与大家分享,另外以后忘了的话还可以来看看,温习一下。
先说说这两天搞的关于滚动条的操作吧!
写之前说明一下,这个例子是将一个文本文件在屏幕上显示出来,其中m_vecFileBuf中存放的是被显示文件的内容,每行作为一条记录,m_LongLine是该文件中最长一行的字符数,StartDraw()函数就是画图写字部分了。m_iCurLine,m_iCurCol分别是当前行数和列数。
1.定义CScrollBar对象
CScrollBar m_verScroll; //垂直滚动条
CScrollBar m_horScroll; //水平滚动条
这里定义了两个滚动条对象,一个垂直滚动条,一个水平滚动条
2. 使用Create方法创建滚动条
//获取区域坐标
CRect rectClient;
GetClientRect( &rectClient );
//创建滚动条,分别在区域右侧和下方显示垂直滚动条和水平滚动条
UINT nIDver = IDC_VERTSCROLL;
UINT nIDhor = IDC_HORZSCROLL;
m_verScroll.Create( SBS_VERT |SBS_LEFTALIGN ,
CRect(rectClient.right-15, rectClient.top, rectClient.right, rectClient.bottom-15), this, nIDver);
m_horScroll.Create( SBS_HORZ |SBS_TOPALIGN ,
CRect(rectClient.left, rectClient.bottom-15, rectClient.right-15, rectClient.bottom), this, nIDhor);
3.设置滚动条信息
//设置垂直滚动条信息
SCROLLINFO sif;
sif.cbSize = sizeof(SCROLLINFO);
sif.fMask = SIF_RANGE|SIF_PAGE;
sif.nMin = 0;
sif.nMax = m_vecFileBuf.size();
sif.nPage = rectClient.Height()/16;
m_verScroll.SetScrollInfo(&sif);
//设置水平滚动条信息
SCROLLINFO sifhor;
sifhor.cbSize = sizeof(SCROLLINFO);
sifhor.fMask = SIF_RANGE |SIF_PAGE;
sifhor.nMin = 0;
sifhor.nMax = m_LongLine/5+1;
sifhor.nPage = rectClient.Width()/40; //5个字符,每个字符8个像素
m_horScroll.SetScrollInfo(&sifhor);
4. 显示滚动条
m_verScroll.ShowScrollBar();
m_horScroll.ShowScrollBar();
5. 创建完成开始操作
5.1 垂直滚动条
OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
switch(nSBCode)
{
//向上滚动一行
case SB_LINEUP:
{
m_iCurLine --;
if( m_iCurLine < 0 )
{
m_iCurLine = 0;
}
StartDraw();
}
break;
//向下滚动一行
case SB_LINEDOWN:
{
m_iCurLine ++;
if( m_iCurLine >= (int)m_vecFileBuf.size() )
{
m_iCurLine = 0;
}
StartDraw();
}
break;
//向前翻页
case SB_PAGEUP:
{
//获取当前区域
CRect rc;
GetClientRect(&rc);
m_iCurLine -= rc.Height()/16;
if ( m_iCurLine < 0 )
{
m_iCurLine = 0;
}
StartDraw();
}
break;
//向后翻页
case SB_PAGEDOWN:
{
CRect rc;
GetClientRect( &rc );
m_iCurLine += rc.Height()/16;
if ( m_iCurLine >= (int)m_vecFileBuf.size() )
{
m_iCurLine = 0;
}
StartDraw();
}
break;
//拖动滚动框到指定位置,当前位置在nPos中指定
case SB_THUMBTRACK:
{
m_iCurLine = nPos;
if ( m_iCurLine >= (int)m_vecFileBuf.size() )
{
m_iCurLine = 0;
}
StartDraw();
}
break;
//滚动到一个绝对位置,当前位置在nPos中指定
case SB_THUMBPOSITION:
{
}
break;
default:
break;
}
//设置滑块位置
m_verScroll.SetScrollPos( m_iCurLine, TRUE );
CDialog::OnVScroll( nSBCode, nPos, pScrollBar );
}
5.2 水平滚动条
OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
switch(nSBCode)
{
//左移一列(5个字符)
case SB_LINELEFT:
{
m_iCurCol --;
if( m_iCurCol < 0 )
{
m_iCurCol = 0;
}
StartDraw();
}
break;
//右移一列
case SB_LINERIGHT:
{
m_iCurCol ++;
if( m_iCurCol >= m_LongLine/5+1 )
{
m_iCurCol = 0;
}
StartDraw();
}
break;
//左移一页(4列)
case SB_PAGEUP:
{
m_iCurCol -=4;
if( m_iCurCol < 0 )
{
m_iCurCol = 0;
}
StartDraw();
}
break;
//右移一页
case SB_PAGEDOWN:
{
m_iCurCol +=4;
if( m_iCurCol >= m_LongLine/5+1 )
{
m_iCurCol = 0;
}
StartDraw();
}
break;
case SB_THUMBTRACK:
{
m_iCurCol = nPos;
if ( m_iCurCol >= m_LongLine/5+1 )
{
m_iCurCol = 0;
}
StartDraw();
}
break;
default:
break;
}
//设置滑块位置
m_horScroll.SetScrollPos(m_iCurCol, TRUE);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
先写这么多吧,我也只是看了些许皮毛,有更多问题再慢慢讨论。
- 关于对话框滚动条,
- 关于滚动条
- 关于对话框滚动条
- 关于js滚动条
- 关于首页滚动条
- Qt关于滚动条
- 关于IKImageBrowserView滚动条
- 关于滚动条
- 关于滚动条事件
- 关于层的滚动条
- Qt4 关于实现滚动条
- 关于HTML中的滚动条
- 关于滚动条控制问题
- 关于HTML中的滚动条
- Winform:关于滚动条美化
- 关于ScrollView滚动条隐藏。
- 关于HTML滚动条问题
- 关于滚动条—固定
- aaaa
- android 动画
- 代码高亮_总结
- 数据库打包批处理
- 转Apache安装
- 关于滚动条
- 开启事务后,在其中多次查询同一表会报错(运行超时)的解决办法
- 彩蛋
- SELinux
- allocator使用
- 分享--前惠普大中华区总裁孙振耀感言.
- [黑客必看]我用NC的心得
- 如何生小“马”
- 人生的三重境界