VC++之Scroll Bar

来源:互联网 发布:皇朝娱乐关注软件 编辑:程序博客网 时间:2024/06/02 17:05
OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 中,nSBCode就是用户的操作,然后你再相应改变滚动条状态就可以了。nSBCode有9种可能,分别是:
// SB_LINEUP 0
// SB_LINEDOWN 1
// SB_PAGEUP 2
// SB_PAGEDOWN 3
// SB_THUMBPOSITION 4
// SB_THUMBTRACK 5
// SB_TOP 6
// SB_BOTTOM 7
// SB_ENDSCROLL 8

VC++之Scroll Bar

 

  965(884普 及 网 150 http://www.pujiwang.com)

    Scroll Bar一般不会单独使用,因为SpinCtrl可以取代滚动条的一部分作用,但是如果你需要自己生成派生窗口,滚动条还是会派上一些用场。创建一个滚动条可以使用成员函数:

BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );

其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对滚动条指明专门的风格。
SBS_VERT 风格将创建一个垂直的滚动条。
SBS_HORZ 风格将创建一个水平的滚动条。


在创建滚动条后需要调用void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE )设置滚动范围,

int GetScrollPos( )/int SetScrollPos( )用来得到和设置当前滚动条的位置。

void ShowScrollBar( BOOL bShow = TRUE );用来显示/隐藏滚动条。

BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH )用来设置滚动条上箭头是否为允许状态。nArrowFlags可取以下值:

ESB_ENABLE_BOTH 两个箭头都为允许状态
ESB_DISABLE_LTUP 上/左箭头为禁止状态
ESB_DISABLE_RTDN 下/右箭头为禁止状态
ESB_DISABLE_BOTH 两个箭头都为禁止状态


如果需要在滚动条位置被改变时得到通知,需要在父窗口中定义对消息WM_VSCROLL/WM_HSCROLL的映射。方法为在父窗口类中重载afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )/

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

所使用的消息映射宏为:ON_WM_VSCROLL( ),ON_WM_HSCROLL( ),在映射宏中不需要指明滚动条的ID,因为所有滚动条的滚动消息都由同样的函数处理。在OnHScroll/OnVScroll的第三个参数会指明当前滚动条的指针。第一个参数表示滚动条上发生的动作,可取以下值:
SB_TOP/SB_BOTTOM 已滚动到顶/底部
SB_LINEUP/SB_LINEDOWN 向上/下滚动一行
SB_PAGEDOWN/SB_PAGEUP 向上/下滚动一页
SB_THUMBPOSITION/SB_THUMBTRACK 滚动条拖动到某一位置,参数nPos指明当前位置(参数nPos在其它的情况下是无效的)
SB_ENDSCROLL 滚动条拖动完成(用户松开鼠标) 

 

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

参数: nSBCode 指定一个指示用户的滚动请求的滚动条代码。这个参数可以是下列值之一:

· SB_BOTTOM 滚动到底部。

· SB_ENDSCROLL 结束滚动。

· SB_LINEDOWN 向下滚动一行。

· SB_LINEUP 向上滚动一行。

· SB_PAGEDOWN 向下滚动一页。

· SB_PAGEUP 向上滚动一页。

· SB_THUMBPOSITION 滚动到一个绝对位置。当前位置在nPos中指定。

· SB_THUMBTRACK 拖动滚动框到指定位置。当前位置在nPos中指定。

· SB_TOP 滚动到顶部。 nPos 如果滚动条代码是SB_THUMBPOSITION或SB_THUMBTRACK,则此参数指定滚动框的位置;否则不使用此参数。根据初始的滚动范围,nPos可能会是负值,如果需要的话可将其强制转换为int值。 pScrollBar 如果滚动信息来自于一个滚动条控制,则此参数是指向该控制的指针。如果用户单击了一个窗口的滚动条,则此参数是NULL。该指针可能是临时的,不能被保存为给将来使用。

说明:当用户单击窗口的垂直滚动条时,框架调用此成员函数。希望滚动框被拖动时给出一定反馈的应用程序通常会使用OnVScroll函数。如果OnVScroll滚动此CWnd对象的内容,则必须调用SetScrollPos成员函数来恢复滚动条的位置。注意框架调用这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现,这个实现将使用最初随着消息传递过来的参数,而不是使用你提供给函数的参数。

 

 

void CHtmlTips::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 SCROLLINFO scrollinfo;
 GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
 switch (nSBCode)
 {
 case SB_LEFT:
  ScrollWindow((scrollinfo.nPos-scrollinfo.nMin)*10,0);
  scrollinfo.nPos = scrollinfo.nMin;
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  break;
 case SB_RIGHT:
  ScrollWindow((scrollinfo.nPos-scrollinfo.nMax)*10,0);
  scrollinfo.nPos = scrollinfo.nMax;
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  break;
 case SB_LINELEFT:
  scrollinfo.nPos -= 1;
  if (scrollinfo.nPos<scrollinfo.nMin)
  {
   scrollinfo.nPos = scrollinfo.nMin;
   break;
  }
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  ScrollWindow(10,0);
  break;
 case SB_LINERIGHT:
  scrollinfo.nPos += 1;
  if (scrollinfo.nPos>scrollinfo.nMax)
  {
   scrollinfo.nPos = scrollinfo.nMax;
   break;
  }
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  ScrollWindow(-10,0);
  break;
 case SB_PAGELEFT:
  scrollinfo.nPos -= 5;
  if (scrollinfo.nPos<scrollinfo.nMin)
  {
   scrollinfo.nPos = scrollinfo.nMin;
   break;
  }
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  ScrollWindow(10*5,0);
  break;
 case SB_PAGERIGHT:
  scrollinfo.nPos += 5;
  if (scrollinfo.nPos>scrollinfo.nMax)
  {
   scrollinfo.nPos = scrollinfo.nMax;
   break;
  }
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  ScrollWindow(-10*5,0);
  break;
 case SB_THUMBPOSITION:
  break;
 case SB_THUMBTRACK:
  ScrollWindow((scrollinfo.nPos-nPos)*10,0);
  scrollinfo.nPos = nPos;
  SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
  break;
 case SB_ENDSCROLL:
  break;
 }

 CDHtmlDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

 

 

void CHtmlTips::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 SCROLLINFO scrollinfo;
 GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
 switch (nSBCode)
 {
 case SB_BOTTOM:
  ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10);
  scrollinfo.nPos = scrollinfo.nMax;
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  break;
 case SB_TOP:
  ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10);
  scrollinfo.nPos = scrollinfo.nMin;
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  break;
 case SB_LINEUP:
  scrollinfo.nPos -= 1;
  if (scrollinfo.nPos<scrollinfo.nMin)
  {
   scrollinfo.nPos = scrollinfo.nMin;
   break;
  }
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  ScrollWindow(0,10);
  break;
 case SB_LINEDOWN:
  scrollinfo.nPos += 1;
  if (scrollinfo.nPos>scrollinfo.nMax)
  {
   scrollinfo.nPos = scrollinfo.nMax;
   break;
  }
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  ScrollWindow(0,-10);
  break;
 case SB_PAGEUP:
  scrollinfo.nPos -= 5;
  if (scrollinfo.nPos<scrollinfo.nMin)
  {
   scrollinfo.nPos = scrollinfo.nMin;
   break;
  }
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  ScrollWindow(0,10*5);
  break;
 case SB_PAGEDOWN:
  scrollinfo.nPos += 5;
  if (scrollinfo.nPos>scrollinfo.nMax)
  {
   scrollinfo.nPos = scrollinfo.nMax;
   break;
  }
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  ScrollWindow(0,-10*5);
  break;
 case SB_ENDSCROLL:
  // MessageBox("SB_ENDSCROLL");
  break;
 case SB_THUMBPOSITION:
  // ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
  // scrollinfo.nPos = nPos;
  // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  break;
 case SB_THUMBTRACK:
  ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
  scrollinfo.nPos = nPos;
  SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
  break;
 }