CScrollBar 滚动条操作

  CScrollBar类的成员函数Create的函数原型如下:

virtual BOOL Create(
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID 
);

 参数dwStyle指定滚动条控件的风格。rect指定滚动条控件的位置和尺寸。pParentWnd为指向滚动条控件父窗口的指针,nID指定滚动条控件的ID。  滚动条控件风格 :

       SBS_HORZ:指定滚动条为水平滚动条。如果没有指定SBS_BOTTOMALIGN或SBS_TOPALIGN风格,则滚动条的高度、宽度和位置由Create函数的rect参数给出。
       SBS_VERT:指定滚动条为垂直滚动条。如果没有指定SBS_RIGHTALIGN或SBS_LEFTALIGN风格,则滚动条的高度、宽度和位置由Create函数的rect参数给出。
       SBS_TOPALIGN:与SBS_HORZ配合使用。滚动条的上边缘与Create函数的rect参数指定矩形的上边缘对齐。滚动条高度为系统滚动条的默认高度。
       SBS_BOTTOMALIGN:与SBS_HORZ配合使用。滚动条的下边缘与Create函数的rect参数指定矩形的下边缘对齐。滚动条高度为系统滚动条的默认高度。
       SBS_LEFTALIGN:与SBS_VERT配合使用。滚动条的左边缘与Create函数的rect参数指定矩形的左边缘对齐。滚动条宽度为系统滚动条的默认宽度。
       SBS_RIGHTALIGN:与SBS_VERT配合使用。滚动条的右边缘与Create函数的rect参数指定矩形的右边缘对齐。滚动条宽度为系统滚动条的默认宽度。

       dwStyle参数可以是以上风格中某几个的组合,另外一般也会用到WS_CHILD、WS_VISIBLE风格。例如,创建一个水平滚动条控件,dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_HORZ,创建垂直滚动条控件时dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_VERT。

       CScrollBar类的主要成员函数

       BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL);   获得滑动块的信息 注意是滑动块 你拖动的小快快

       获取的滚动条的参数信息,该信息为SCROLLINFO结构体的形式。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针。SCROLLINFO结构体的定义如下:

C++代码
  1. typedef struct tagSCROLLINFO {    
  2.     UINT cbSize;         // 结构的尺寸(字节为单位)    
  3.     UINT fMask;          // 说明结构中的哪些参数是有效的,可以是屏蔽值的组合,如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构都有效   
  4.     int  nMin;           // 滚动范围最小值,当fMask 中包含SIF_RANGE 时有效  
  5.     int  nMax;           // 滚动范围最大值,当fMask 中包含SIF_RANGE 时有效  
  6.     UINT nPage;          // 页尺寸,用来确定比例滚动框的大小,当fMask中包含SIF_PAGE时有效   
  7.     int  nPos;           // 滚动框的位置,当fMask 中包含SIF_POS 有效   
  8.     int  nTrackPos;      // 滚动时滚动框的位置,当fMask 中包含SIF_TRACKPOS 时有效,该参数只能查询,不能设置,最好不要用该参数来查询拖动时滚动框的位置   
  9. }   SCROLLINFO, *LPSCROLLINFO;    
  10. typedef SCROLLINFO CONST *LPCSCROLLINFO;  

      使用时一般如下:

	SCROLLINFO info;//配置滑块的一些信息! 注意是滑块的! 不是滚动条 是你拖动的那个小快快 
	info.cbSize = sizeof(SCROLLINFO);  //固定!  本结构的大小    
	info.fMask = SIF_ALL;  //一些属性  
	info.nMin = 0;   //滑块所能到达的最小范围
	info.nMax = bm.bmHeight;//滑块所能到达的最大范围 假如是一个图像 则为图像的高度
	info.nPage = 10;//滑块的大小
	info.nPos = m_VScrollPos;//滑块的位置


 参数nMask 的含义与SCROLLINFO 结构体中的fMask一样。该函数在获取信息成功则返回TRUE,否则返回FALSE。

       BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE);

       用于设置滑动块的各种参数信息。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘。该函数操作成功则返回TRUE,否则返回FALSE。

       int GetScrollPos( ) const;

       获取滑动块的当前位置。如果失败则返回0。

       int SetScrollPos(int nPos, BOOL bRedraw = TRUE);

       将滑动块移动到指定位置。参数nPos指定了滚动块的新位置,参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘。函数返回滚动框原来的位置,若操作失败则返回0。

       void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;  这里是滚动条的范围!!!!! 与窗口的当前大小有关系

       获取滚动条的滚动范围。参数lpMinPos指向滚动条滚动范围的最小值,参数lpMaxPos指向滚动条滚动范围的最大值。

       void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);

       用于指定滚动条的滚动范围。参数nMinPos 和nMaxPos 分别指定了滚动范围的最小值和最大值,两者的差不得超过32767。当两者都为0 时,滚动条将被隐藏。参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘。

       OnHScroll()与OnVScroll()函数

       无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL 和WM_VSCROLL消息发送出去的。对这两个消息的默认处理函数是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生类中对这两个函数进行重载,以实现滚动功能。也就是说,假设在一个对话框中放入了一个水平滚动条,我们可以在对话框类中重载OnHScroll函数,并在OnHScroll函数中实现滚动功能。

       这两个函数的声明如下:

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

       参数nSBCode是通知消息码,主要通知码及含义的介绍下面已列出。nPos 是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义。如果通知消息是滚动条控件发来的,那么pScrollBar 是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar 为NULL。

       SB_BOTTOM/SB_RIGHT:滚动到底端(右端)
       SB_TOP/SB_LEFT:滚动到顶端(左端)
       SB_LINEDOWN/SB_LINERIGHT:向下(向右)滚动一行(列)
       SB_LINEUP/SB_LINELEFT:向上(向左)滚动一行(列)
       SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滚动一页
       SB_PAGEUP/SB_PAGELEFT:向上(向左)滚动一页
       SB_THUMBPOSITION:滚动到指定位置
       SB_THUMBTRACK:滚动框被拖动。可利用该消息来跟踪对滚动框的拖动
       SB_ENDSCROLL:滚动结束

       CScrollBar类应用实例

       讲完了基础知识,鸡啄米还是给大家一个简单的实例。例子非常简单,就是在一个对话框中加入一个水平滚动条控件和一个编辑框控件,无论滚动条控件是在滚动还是静止,编辑框中都显示滚动块的当前位置。以下是具体开发步骤:

       1. 创建一个基于对话框的MFC工程,名称设置为“Example26”。

       2. 在自动生成的对话框模板IDD_EXAMPLE26_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Horizontal Scroll Bar控件,ID设置为IDC_HORI_SCROLLBAR。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“滚动块当前位置:”,编辑框的ID设为IDC_HSCROLL_EDIT,Read Only属性设为True。此时的对话框模板如下图:

CScrollBar 滚动条操作_第1张图片

      
       3. 为滚动条IDC_HORI_SCROLLBAR添加CScrollBar类型的控件变量m_horiScrollbar。

       4. 在对话框初始化时,我们需要设置滚动条的滚动范围和初始位置,并在编辑框中显示初始位置,那么需要修改CExample26Dlg::OnInitDialog()函数为:

C++代码
  1. BOOL CExample26Dlg::OnInitDialog()   
  2. {   
  3.     CDialogEx::OnInitDialog();   
  4.   
  5.     // Add "About..." menu item to system menu.   
  6.   
  7.     // IDM_ABOUTBOX must be in the system command range.   
  8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  9.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  10.   
  11.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  12.     if (pSysMenu != NULL)   
  13.     {   
  14.         BOOL bNameValid;   
  15.         CString strAboutMenu;   
  16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
  17.         ASSERT(bNameValid);   
  18.         if (!strAboutMenu.IsEmpty())   
  19.         {   
  20.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  22.         }   
  23.     }   
  24.   
  25.     // Set the icon for this dialog.  The framework does this automatically   
  26.     //  when the application's main window is not a dialog   
  27.     SetIcon(m_hIcon, TRUE);         // Set big icon   
  28.     SetIcon(m_hIcon, FALSE);        // Set small icon   
  29.   
  30.     // TODO: Add extra initialization here   
  31.     // 设置水平滚动条的滚动范围为1到100   
  32.     m_horiScrollbar.SetScrollRange(1, 100);   
  33.     // 设置水平滚动条的初始位置为20   
  34.     m_horiScrollbar.SetScrollPos(20);   
  35.     // 在编辑框中显示20   
  36.     SetDlgItemInt(IDC_HSCROLL_EDIT, 20);   
  37.   
  38.     return TRUE;  // return TRUE  unless you set the focus to a control   
  39. }  

       5. 现在滚动条还不能正常滚动,并且编辑框中数字也不随滚动改变。根据上面所讲,我们可以重载CExample26Dlg类的OnHScroll函数。具体操作为,在CExample26Dlg类的属性页面的工具栏上点“Messages”按钮,找到WM_HSCROLL消息,添加响应函数就可以了。OnHScroll函数重写后如下:

C++代码
  1. void CExample26Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)   
  2. {   
  3.     // TODO: Add your message handler code here and/or call default   
  4.     int pos = m_horiScrollbar.GetScrollPos();    // 获取水平滚动条当前位置   
  5.   
  6.     switch (nSBCode)    
  7.     {    
  8.         // 如果向左滚动一列,则pos减1   
  9.         case SB_LINEUP:    
  10.             pos -= 1;    
  11.             break;    
  12.         // 如果向右滚动一列,则pos加1   
  13.         case SB_LINEDOWN:    
  14.             pos  += 1;    
  15.             break;    
  16.         // 如果向左滚动一页,则pos减10   
  17.         case SB_PAGEUP:    
  18.             pos -= 10;    
  19.             break;    
  20.         // 如果向右滚动一页,则pos加10   
  21.         case SB_PAGEDOWN:    
  22.             pos  += 10;    
  23.             break;    
  24.         // 如果滚动到最左端,则pos为1   
  25.         case SB_TOP:    
  26.             pos = 1;    
  27.             break;    
  28.         // 如果滚动到最右端,则pos为100   
  29.         case SB_BOTTOM:    
  30.             pos = 100;    
  31.             break;      
  32.         // 如果拖动滚动块滚动到指定位置,则pos赋值为nPos的值   
  33.         case SB_THUMBPOSITION:    
  34.             pos = nPos;    
  35.             break;    
  36.         // 下面的m_horiScrollbar.SetScrollPos(pos);执行时会第二次进入此函数,最终确定滚动块位置,并且会直接到default分支,所以在此处设置编辑框中显示数值   
  37.         default:    
  38.             SetDlgItemInt(IDC_HSCROLL_EDIT, pos);   
  39.             return;    
  40.     }    
  41.   
  42.     // 设置滚动块位置   
  43.     m_horiScrollbar.SetScrollPos(pos);   
  44.   
  45.     CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);   
  46. }  

       6. 编译运行程序,弹出结果对话框,可以自己拖动滚动块看是否能正常滚动,并且编辑框中也显示了正确的数值。效果如下:

CScrollBar 滚动条操作_第2张图片

        至于垂直滚动条,其实与水平滚动条类似,大家可以自己写写垂直滚动条的例子,鸡啄米就不再举例了。

        滚动条控件的内容就讲到这里了,比较基础,但这些是以后应用滚动条控件的必知内容。鸡啄米欢迎大家常来此学习交流,谢谢。

转载自 http://www.jizhuomi.com/software/191.html

你可能感兴趣的:(CScrollBar 滚动条操作)