滚动条滚动条(Scroll Bar)主要用来从某一预定义值范围内快速有效地进行浏览,滚动条分为垂直滚动条(Horizontal Scroll Bar)和水平滚动条(Vertical Scroll Bar)两种,如图3.5.41所示。
在滚动条内有一个滚动框,图3.5.41垂直和水平滚动条用来表示当前的值。
用鼠标单击滚动条,可以使滚动框移动一页或一行,也可以直接拖动滚动框。
滚动条即可以作为一个独立控件存在,也可以作为窗口、列表框和组合框的一部分。
滚动条控件的各种操作都封装在MFC的CScrollBar类中。
图3.5.42向前拖动滚动条的情况例3.23在对话框上设计一个滚动条、一个静态文本和一个编辑框。
当拖动滚动条向前进时,编辑框的数字逐渐增加,而静态文本的背景逐渐变红,拖动滚动条向后,编辑框的数字逐渐减少,静态文本的红颜色逐渐变淡,如图3.5.42所示。
(1)创建一个基于对话框的应用程序,名为:滚动条。
(2)删除原来的Cancel(取消)按钮,将原来的OK(确定)按钮的标题改为:退出。
(3)参照图3.5.42控件布局,用编辑器为对话框添加如表3.30所示控件,并加成员变量。
(4)为CMyDlg.h添加一个布尔变量即:BOOL m_bEditOK;并在CMyDlg.cpp 的构造函数中将其初值设为假即:m_bEditOK=FALSE;(5)增加充填颜色函数,将项目工作区切换到ClassView页面,用鼠标右击“CMyDlg”项,在弹出的快捷菜单中选中“Add Member Function”,在Function 处写:void,在Function Declaration处写:Draw()。
表3.30添加的控件及成员变量控件ID号标题属性成员变量大小静态文本IDC_DRAW默认Static edge静态文本默认红(R)编辑框IDC_EDIT1默认int m_RValue0-255水平滚动条IDC_SCROLLBAR1默认CScrollBar m_Scroll(6)切换到ClassWizard的Message Maps标签页,在CMyDlg类中,为编辑框IDC_EDIT1添加EN_CHANGE的消息映射,并加代码:void CMyDlg::OnChangeEdit1(){if(!m_bEditOK)return;UpdateData();//将控件的内容赋给成员变量m_Scroll.SetScrollPos(m_RValue);Draw();}(4)在CMyDlg.cpp文件中的OnPaint()函数中增加下列代码:void CMyDlg::OnPaint(){CPaintDC dc(this);//注意,要保留原程序的此条语句CWnd*pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();Draw();}(5)在CMyDlg.cpp文件中的OnInitDialog()函数中增加下列代码:BOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();…….…………….m_Scroll.SetScrollRange(0,255);m_Scroll.SetScrollPos(m_RValue);UpdateData(FALSE);//将成员变量数据传给控件m_bEditOK=TRUE;return TRUE;//return TRUE unless you set the focus to a control}(6)用ClassWizard为对话框类CMyDlg添加WM_HSCROLL映射消息,并加代码:void CMyDlg::OnHScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar) {int nID=pScrollBar->GetDlgCtrlID();//获取对话框中控件的ID号if(nID==IDC_SCROLLBAR1){switch(nSBCode){case SB_LINELEFT:m_RValue--;break;//单击滚动条左箭头case SB_LINERIGHT:m_RValue++;break;//单击滚动条右箭头case SB_PAGELEFT:m_RValue-=10;break;case SB_PAGERIGHT:m_RValue+=10;break;case SB_THUMBTRACK:m_RValue=nPos;break;}if(m_RValue<0)m_RValue=0;if(m_RValue>255)m_RValue=255;m_Scroll.SetScrollPos(m_RValue);}UpdateData(FALSE);//将成员变量数据传给控件Draw();CDialog::OnHScroll(nSBCode,nPos,pScrollBar);}(7)为第5步添加的Draw()函数,加下列代码:void CMyDlg::Draw(){CWnd*pWnd=GetDlgItem(IDC_DRAW);//获得静态文本的起始地址,即ID标识CDC*pDC=pWnd->GetDC();//获得窗口当前的设备环境指针CBrush drawBrush;//定义画刷变量drawBrush.CreateSolidBrush(m_RValue);//建立画刷颜色值CBrush*pOldBrush=pDC->SelectObject(&drawBrush);CRect rcClient;pWnd->GetClientRect(rcClient);pDC->Rectangle(rcClient);pDC->SelectObject(pOldBrush);}(8)编译运行,结果见图3.5.42所示。
说明:由于滚动条中间的滚动块在默认时是不会停止在用户操作的位置处的,因此需要调用SetScrollPos函数来进行相应位置的设定。
滚动条(CScrollBar类)的操作函数(1)GetScrollPos()函数,格式:int GetScrollPos()const;该函数返回滚动框的当前位置,若操作失败则返回0。
(2)SetScrollPos()函数,格式:int SetScrollPos(int nPos,BOOL bRedraw=TRUE);该函数将滚动框移动到指定位置。
参数:nPos指定了新的位置。
bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘。
函数返回滚动框原来的位置,若操作失败返回0。
(3)GetScrollRange()函数,格式:void GetScrollRange(LPINT lpMinPos,LPINT lpMaxPos)const;该函数对滚动条的滚动范围进行查询。
参数:lpMinPos和lpMaxPos分别指向滚动范围的最小和最大值(4)SetScrollRange()函数,格式:void SetScrollRange(int nMinPos,int nMaxPos,BOOL bRedraw=TRUE);该函数用于指定滚动条的滚动范围。
参数:nMinPos和nMaxPos分别指定了滚动范围的最小和最大值,这两者指定的滚动范围不得超过32767当两者都为0时,滚动条将被隐藏。
bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘。
(5)GetScrollnfo()函数,格式:BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo,UINT nMask);该函数用来获取滚动条的各种状态,包括滚动范围、滚动框的位置和页尺寸。
参数:1)nMask的意义与SCROLLINFO结构中的fMask相同,函数在获得有效值后返回TRUE,否则返回FALSE。
2)lpScrollInfo指向一个SCROLLINFO结构,该结构定义如下:Typedf struct tagSCROLLINFO{UINT cbSize;结构的尺寸UINT fMask;说明结构中的哪些参数是有效的,可以是屏蔽值的组合,如:SIF_POS|SIF_PAGE若为SIF_ALL则整个结构都有效int nMin;滚动范围最大值,当fMask中包含SIF_RANGE时有效int nMax;滚动范围最小值,当fMask中包含SIF_RANGE时有效UINT nPage;页尺寸,用来确定比例滚动框的大小,当fMask中包含SIF_PAGE时有效int nPos;滚动框的位置,当fMask中包含SIF_POS有效int nTrackPos;滚动时滚动框的位置,当fMask中包含SIF_TRACKPOS时有效,该参数只能查询,不能设置,最好不要用该函数来查询拖动时滚动框的位置}SCROLLINFO;typedef SCROLLINFO FAR*LPSCROLLINFO;(6)SetScrollInfo()函数,格式:BOOL SetScrollInfo(LPSCROLLINFO lpScrollnfo,BOOL bRedraw=TRUE);该函数用于设置滚动条的各种状态,如设定页尺寸,从而实现比例滚动框。
参数:1)lpScrollInfo指向一个SCROLLINFO结构。
2)bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘,若操作成功,返回TRUE,否则返回FALSE。
说明:CWnd类也提供了一些函数来查询和设置所属的标准滚滚动条。
这些函数与CScrollBar类的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条。
(7)GetScrollPos函数,格式:int GetScrollPos(int nBar)const;参数:nBar用来选择滚动条,可以为下列值:SB_CTL:表示滚动条为控件滚动条SB_HORZ:指定水平滚动条SB_VERT:指定垂直滚动条(8)OnHScroll()和OnVScroll()函数无论是标准滚动条,还是滚动条控件,滚动通知消息都是用WM_HSCROLL 和WM_VSCROLL消息发送出去的。
对这两个消息的默认处理函数是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生类中对这两个函数从新设计,以实现滚动功能。
这两个函数的声明格式为:afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar);afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar);参数:1)nSBCode是通知消息码,主要通知码如表3.31所示。