友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第85章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




属性只有一种:即Align属性,该属性可以为三种值之一:None、 

Top/Left和Bottom/Right。其中,Top/Left表示将滚动条控件的左上 

边与由CreateWindowEx函数的参数定义的矩形的左上边对齐,而 

Botton/Right则表示以右下边进行对齐。该属性的默认值为None,即 

不进行任何对齐操作。  



Windows标准滚动条的行为由MFC类CScrollBar封装。表中列出了在类 

CScrollBar中定义的成员函数及其说明。  



                表6。 31 在类CScrollBar中定义的成员函数  



          成员函数        描述  



          CScrollBar  构造一个CScrollBar对象  



          Create      创建一个Windows滚动条,并将它与 

                      CScrollBar对象相关联  



          GetScrollPos  获得滚动条的当前位置  



          SetScrollPos  设置滚动条的当前位置  



          GetScrollRange   获得给定滚动条的当前最大和最小位置  



          SetScrollRange   设置给定滚动条的当前最大和最小位置  



          ShowScrollBar  显示或隐藏滚动条  



          EnableScrollBar  允许或禁止滚动条上的一个或两个箭头  



          SetScrollInfo  设置关于滚动条的信息  



          GetScrollInfo  获得滚动条的信息  



          GetScrollLimit   获得滚动条的限制  



当用户单击了滚动条时,父窗口将收到WM_HSCROLL或WM_VSCROLL消 

息,在CWnd类的定义了处理该消息的成员函数为OnHScroll和 

OnVScroll。成员函数OnHScroll的原型如下:  



afx_msg void OnHScroll( UINT nSBCode; UINT nPos; CScrollBar* pScrollBar );  



第一个参数nSBCode指定如下之一的滚动条代码,这些代码代表用户 

所作的滚动请求:  



       SB_LEFT:          向左滚动较远距离  


…………………………………………………………Page 390……………………………………………………………

      SB_ENDSCROLL:   结束滚动  



      SB_LINELEFT:    向左滚动  



      SB_LINERIGHT:   向右滚动  



      SB_PAGELEFT:    向左滚动一页  



      SB_PAGERIGHT:   向右滚动一页  



      SB_RIGHT:       向右滚动较远距离  



      SB_THUMBPOSITION:  滚动到绝对位置。当前位置由 

                      nPos参数指定  



      SB_THUMBTRACK:  拖动滚动条到指定的位置。当 

                      前位置由nPos参数指定  



通常,SB_THUMBTRACK滚动条代码由应用程序使用,以便在滚动条被 

拖动时给以反馈。如果应用程序滚动了由滚动条控制的内容,它必须 

使用SetScrollPos来重置滚动条的位置。  



传递给函数OnHScroll的参数反映了当收到消息时由框架获得的值, 

如果在重载版本的函数中调用了基类的实现,该实现将使用最初由消 

息传递的参数,而不是向函数提供的参数。  



消息WM_VSCROLL的处理函数OnVScroll与OnHScroll类似,我们这里就 

不再重复讲述了。下面我们来看一个例子:  



1。  创建一个名为ScrollDemo的基于对话框的MFC工程,按图设置对话 

框的各控件。其中水平滚动条控件的ID为IDC_SCROLL,编辑框控件的 

ID为IDC_CURPOS。  



                                   



            图6。 58 示例程序ScrollDemo的主对话框的设计  



2。   使用ClassWizard为编辑框控件IDC_CURPOS映射类型为int的成员 

变量m_iCurPos,并设置其最大值为100,最小值为…100。  



3。  使用ClassWizard在类CScrollDemoDlg中为消息WM_HSCROLL添加处 

理函数OnHScroll,其代码如下:  


…………………………………………………………Page 391……………………………………………………………

void CScrollDemoDlg::OnHScroll(UINT nSBCode; UINT nPos; CScrollBar* pScrollBar)   



{  



// 获得原有的滚动条位置  



int iPos=pScrollBar…》GetScrollPos();  



// 根据不同的拖动方式设置新的滚动条位置  



switch (nSBCode)  



{  



// 向右滚动一行  



case SB_LINERIGHT:  



iPos+=1;  



break;  



// 向左滚动一行  



case SB_LINELEFT:  



iPos…=1;  



break;  



// 向右滚动一页  



case SB_PAGERIGHT:  



iPos+=10;  



break;  



// 向左滚动一页  



case SB_PAGELEFT:  



iPos…=10;  



break;  



// 直接拖动滚动块  



case SB_THUMBTRACK:  



iPos=nPos;  


…………………………………………………………Page 392……………………………………………………………

break;  



default:  



break;  



}  



// 滚动条的最大位置不超过 100; 最小位置不小于 …100  



if (iPos100) iPos=100;  



// 必须手动的更新滚动条的当前位置  



pScrollBar…》SetScrollPos(iPos);  



// 在编辑框中显示滚动条的当前位置  



SetDlgItemInt(IDC_CURPOS; iPos);  



CDialog::OnHScroll(nSBCode; nPos; pScrollBar);  



}  



上面的代码暗示了一点,这就是在被拖动时,滚动条不会 自动更新其 

位置,我们必须自己在程序中做到这一点,即通过分析不同的滚动方 

式来改变并设置新的滚动条位置,上面的代码演示了这一过程。  



编译上面的程序代码,我们发现滚动条不能正常工作 !这是因为在默 

认情况下,滚动条的滚动范围为从0到0。这时,我们根本不可能对滚 

动条进行有意义的操作。因此,我们需要将下面的代码添加到 

OnInitDialog成员函数:  



CScrollBar *pScroll=(CScrollBar*)GetDlgItem(IDC_SCROLL);  



pScroll…》SetScrollRange(…100; 100);  



pScroll…》SetScrollPos(0);  



SetDlgItemInt(IDC_CURPOS; 0);  



上面的代码设定了滚动条的滚动范围和默认的滚动条位置,然后,将 

当前滚动条位置显示在编辑控件IDC_CURPOS中。  



4。   最后我们来实现一个功能,这就是我们希望当编辑控件中的文本 

发生改变时,滚动条上的滑块的位置也相应的变化。要实现这一点, 


…………………………………………………………Page 393……………………………………………………………

使用ClassWizard为控件IDC_CURPOS的通知消息EN_CHANGE添加消息处 

理函数OnChangeCurPos。  



void CScrollDemoDlg::OnChangeCurPos()   



{  



CString str;  



GetDlgItemText(IDC_CURPOS; str);  



str。TrimLeft();  



str。TrimRight();  



int iPos=0;  



if (str!=〃…〃 && str!=〃〃)  



{  



if (!UpdateData())  



{  



return;  



}  



iPos=m_iCurPos;  



}  



CScrollBar *pScroll=(CScrollBar*)GetDlgItem(IDC_SCROLL);  



pScroll…》SetScrollPos(iPos);  



}  



由于需要检验用户输入数据的有效性,上面的代码比较长。首先,如 

果用户只输入一个负号 “? ”或刚将原有的数据删除,此时不应该报 

错。这里我们可以将滚动条的位置设置为0。由于用户可能在所输入 

的数据之前或之后插入一些空格,这种情况下我们也不应该报错,因 

此,我们使用了一些额外的代码来避免了这种情况。最后,我们使用 

了UpdateData函数来使用控件IDC_CURPOS的值更新成员变量 

m_iCurPos,这样的目的是便于使用MFC提供的对话框数据检验机制。 

但有个不好的地方是,如果用户输
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!