上一篇:MFC界面编程基础(13):列表框和组合框 | 下一篇:MFC界面编程基础(15):程序举例+屏蔽或接收键盘事件 |
---|
滚动条是 CScrollBar 类的对象,是 Windows 应用程序中一个很重要的控件,通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。滚动条有水平和垂直两种。
【例】
建立一个水平滚动条,最小值为 0 ,最大值为 100 ,单击滚动条两端箭头时滑块移动的增量值为 2 ,单击滚动条中的空白处(滑块与两端箭头之间的区域)时滑块移动的增量值为 10 。另有一个只读的编辑框,显示了滑块当前位置所代表的值。
假定工程名为 TEST 。
-
界面设计
首先创建一个对话框应用程序框架,然后放置水平滚动条、编辑框,按表连接变量,编辑框设置为只读。
-
初始化
滚动条的初始化就是设置最小值,最大值,以及初始时滑块所代表的值。滚动条初始化在对话框的初始化函数中完成,涉及两个函数: -
设置最大值和最小值
函数原型:
void SetScrollRange(int nMinPos , int nMaxPos , BOOL bRedraw = TRUE);
参数说明:
①:nMinPos 表示最小值
②:nMinPos 表示最大值 。
③:当 bRedraw 为 TRUE 时重画滚动条。
- 设置滑块的位置
格式:
int SetScrollPos( int nPos , BOOL bRedraw = TRUE );
参数说明 :
①:nPos 表示滑块的位置。
②:当 bRedraw 为 TRUE 时重画滚动条。
滚动条初始化代码如下:
BOOL CTESTDlg::OnInitDialog()
{
┆
// TODO: Add extra initialization here
m_s.SetScrollRange(0,100);
m_s.SetScrollPos(50);
m_e=50; // 初始时,编辑框显示 50 。
UpdateData(FALSE); // 更新编辑框显示的内容。
┆
};
- 编写消息处理函数
当用户在滚动条上进行操作时,滚动条接收不到任何消息。但是对话框却能接收到 WM_HSCROLL (水平滚动条)或 WM_VSCROLL (垂直滚动条)消息,也就是说,程序对滚动条的操作只能在 OnHScroll() 或 OnVScroll() 中编写代码。
滚动条处理 WM_Hscroll 消息的函数为:
void CTESTDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
在对话框的属性面板中查找WM_HSCROLL命令,并添加响应函数
做如图选择,点击“”就把OnHScroll函数添加进去。
响应函数参数说明 :
① pScrollBar 指向用户正在进行操作的滚动条。
② nPos 表示滑块当前的位置。
③ nSBCode 指示用户正在进行的操作,其取值及其意义见表。
程序代码:
…………………………………………………………
void CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{ // TODO: Add your message handler code here and/or call default
if (pScrollBar==&m_s)
{
int iNowPos;
switch(nSBCode)
{
case SB_THUMBTRACK: // 拖动滚动滑块时
m_s.SetScrollPos(nPos);
m_e=nPos;
break;
case SB_LINELEFT : // 单击滚动条向左的箭头
iNowPos=m_s.GetScrollPos(); // 获取滑块当前位置所代表的值
iNowPos=iNowPos-2;
if(iNowPos<0)
iNowPos=0;
m_s.SetScrollPos(iNowPos);
m_e=iNowPos;
break;
case SB_LINERIGHT : // 单击滚动条向右的箭头
iNowPos=m_s.GetScrollPos(); // 获取滑块当前位置所代表的值
iNowPos=iNowPos+2;
if(iNowPos>100)
iNowPos=100;
m_s.SetScrollPos(iNowPos);
m_e=iNowPos;
break;
case SB_PAGELEFT : // 单击滚动条左边的箭头与滑块之间的区域
iNowPos=m_s.GetScrollPos(); // 获取滑块当前位置所代表的值
iNowPos=iNowPos-10;
if(iNowPos<0)
iNowPos=0;
m_s.SetScrollPos(iNowPos);
m_e=iNowPos;
break;
case SB_PAGERIGHT : // 单击滚动条右边的箭头与滑块之间的区域
iNowPos=m_s.GetScrollPos(); // 获取滑块当前位置所代表的值
iNowPos=iNowPos+10;
if(iNowPos>100)
iNowPos=100;
m_s.SetScrollPos(iNowPos);
m_e=iNowPos;
break;
}
}
UpdateData(FALSE);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
…………………………………………………………
说明:
- 由于对话框上可能有多个滚动条,因此函数首先需要根据指针 pScrollBar 确定事件发生在哪一个滚动条上,方法是使用表达式 pScrollBar==&m_s。因为, pScrollBar 指向发生事件的滚动条,所以这个表达式为真时,意味着用户对滚动条 m_s 进行了操作。
- 用户对滚动条的操作有 5 种,因此函数中必须以这 5 种情况分别进行处理。
上一篇:MFC界面编程基础(13):列表框和组合框 | 下一篇:MFC界面编程基础(15):程序举例+屏蔽或接收键盘事件 |
---|