常用滚动条控件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
滚动条
滚动条(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;
该函数对滚动条的滚动范围进行查询。