第13章制作含滚动条的应用程序滚动条是一个交互式的、高度可视化的控件,它包括一个滑块、滚动条的两端的按钮等。滚动条控件与属于窗口的滚动条是不一样的处于窗口的滚动条是由该窗口创建、管理和释放的滚动条控件是由用户创建、管理和释放的13.1滚动条类简介作为任何一个窗口的子控件,滚动条可以通过通知代码来创建,但也可以用对话框资源模板来创建。表13-1CScrollBar类的方法方法说明EnableScrollBar()使滚动条的一个或两个箭头有效或无效GetScrollInfo()获得滚动条的消息GetScrollLimit()获得滚动条的范围GetScrollPos()获得滚动条当前的位置GetScrollRange()获得制定滚动条的当前最大和最小滚动位置SetScrollInfo()设置滚动条的消息SetScrollPos()设置滚动块当前的位置SetScrollRange()设置制定滚动条的最大和最小滚动位置ShowScrollBar()显示或隐藏滚动条创建与初始化滚动条类创建CScrollBar对象的一般步骤(1)用C++关键字new和构造函数CScrollBar::CScrollBar()为一个ScrollBar对象分配一个实例(2)初始化CScrollBar对象,将一个Windows滚动条赋予它,并用CScroll::Create()方法设置参数和样式分配一个滚动条控件对象并返回指向该对象的指针CScrollBar::pMyScroll=newCScrollBar调用CScrollBar::Create()方法初始化指针BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);滚动条窗口的样式表示控件的大小和位置指向控件所属窗口的指针父窗口与滚动条通信的标识在设置滚动条控件时,要通过CScrollBar::SetScrollRange()设置其范围。例如,设置滚动范围为-100到100的垂直滚动条:pMyScroll-SetScrollRange(SB_VERT,-100,100);在设置了范围后,还要通过SetScrollPos()设置滚动块当前位置。例如,滚动块的位置在-100到100的中间,即为0的位置:pMyScroller-SetScrollPos(0);标题为ApplicationofScrollBar滚动条的滚动范围设为0到20单击滚动块与箭头之间的区域。滚动块上移或下移三格,编辑框中的数字加3或减3单击向上或向下的箭头,滚动块向上或向下移动一格,编辑框中的数字加1或减1按住滚动块上下拖动,编辑框中的数字随之变化当前值为10单击Up按钮,滚动块移到最上边,编辑框的数字变为0单击Down按钮,滚动块移到最下边,编辑框的数字变为20单击Reset按钮,滚动块移到中间,编辑框的数字变为10单击Exit按钮,退出应用程序13.2滚动条类编程实例1.应用程序的可视化编程部分对话框中各个对象的属性对象IDCaption滚动条IDC_XCROLLBAR无编辑框IDC_EDIT1无Up按钮IDC_UP_BUTTON&UpDown按钮IDC_DOWN_BUTTON&DownReset命令按钮IDC_RESET_BUTTON&ResetExit按钮IDC_EXIT_BUTTON&Exit2.应用程序的代码编程部分(1)给滚动条连接变量ID变量名类别类型IDC_SCROLLBARm_ScrollbarControlCscrollbarIDC_EDITlm_EditControlCEditBOOLCSCROLLBARDlg::OnInitDialog(){CDialog::OnInitDialog();//将“About...”菜单项加入到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}(2)初始化滚动条//为该对话框设置图标,当该应用程序的主窗口不是一个对话框时,程序将自动设置图标SetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE);//Setsmalliconm_Scrollbar.SetScrollRange(0,20);m_Scrollbar.SetScrollPos(10);charsPos[10];itoa(m_Scrollbar.GetScrollPos(),sPos,10);//数值转成字符m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);UpdateData(FALSE);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}(3)给滚动条消息添加代码voidCSCROLLBARDlg::OnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar){charsPos[10];intiNowPos;switch(nSBCode){if(pScrollBar==&m_Scrollbar){caseSB_THUMBTRACK://拖动滚动滑块时m_Scrollbar.SetScrollPos(nPos);itoa(nPos,sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;caseSB_LINEDOWN://单击滚动条向下的箭头iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos+1;if(iNowPos20)iNowPos=20;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;caseSB_LINEUP://单击滚动条向上的箭头iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos-1;if(iNowPos0)iNowPos=0;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;caseSB_PAGEDOWN://单击滚动条下面的箭头与滚动块之间的区域iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos+3;if(iNowPos20)iNowPos=20;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;caseSB_PAGEUP://单击滚动条上面的箭头与滚动块之间的区域iNowPos=m_Scrollbar.GetScrollPos();iNowPos=iNowPos-3;if(iNowPos0)iNowPos=0;m_Scrollbar.SetScrollPos(iNowPos);itoa(m_Scrollbar.GetScrollPos(),sPos,10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(sPos);break;}}CDialog::OnVScroll(nSBCode,nPos,pScrollBar);}(4)给Exit按钮连接代码voidCSELECTBOXDlg::OnExitButton(){//在此处加入控件通知句柄代码//编写代码开始OnOK();//编写代码结束}(5)给Up按钮添代码voidCSCROLLBARDlg::OnUpButton(){//TODO:在此处加入控件通知句柄代码//代码编写开始m_Scrollbar.SetScrollPos(0);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(0);//代码编写结束}(6)给Down按钮添加代码voidCSCROLLBARDlg::OnDownButton(){//TODO:在此处加入通知句柄代码m_Scrollbar.SetScrollPos(20);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(20);}(7)给Reset按钮添加代码voidCSCROLLBARDlg::OnResetButton(){//TODO:在此处加入通知句柄代码m_Scrollbar.SetScrollPos(10);m_Edit.SetSel(0,-1);m_Edit.ReplaceSel(10);}(8)将编辑框设置为只读在ApplicationofSELECTINGBOX应用程序中,编辑框只是有于显示滚动块的位置,不需要进行编辑,由因此必须将其属性改为只读。创建如图界面,单击“开始”按钮时,按照顺序执行各项操作,在执行完的操作前加对号标志,在正在进行的操作前加箭头标志。(1)AppWizard--AppWizardStep1--Dialogbased--其余默认(2)打开对话框编辑器--将“确定”和“取消”通过Properties“开始”和“退出”,--将“确定”按钮ID改为ID_BEGIN(3)在Control工具条上选Picture按钮---〉创建一个空的图片框--〉Insert菜单--〉Resource菜单项--〉在Resourcetype框中选中Bitmap选项--〉Import--〉加入bmp文件--〉在Properties中的type中选位图--〉接受默认的ID值--〉图片框中出现位图(4)在Control工具条中选择ListControl按钮---〉画一个列表框控件--〉在其上单击鼠标右键选择Property菜单项--〉将ID改为IDC_LISTCTRL1,注意还要选中Disabled选项(5)在Control工具条中选择Progress按钮--画一个进度条控件--〉在其上单击鼠标右键选择Property菜单项--〉将ID改为IDC_PROGRESS1,注意还要选中Disabled选项。(6)Insert菜单--Resource菜单项--Resourcetype列表框中的Icon项--单击Import按钮--加入Res文件夹中的arrow.ico,empty.ico,finished.ico三个文件--将ID值改为IDI_ICON_ARROW,IDI_ICON_EMPTY,IDI_ICON_FINISHED给控件连接的变量控件ID变量类型变量名IDC_LISTCTRL1ClistCtrlm_ListCtrl1IDC_PROGRESS1CprogressCtrlm_Progress加入的变量变量类型变量名说明HICONhIcon[7]存储图像列表中各图标句柄的数组CStringProcName[7]存储列表控