vc 实现垂直滚动条对话框

关于SCROLLINFO

  滚动条(卷动列)信息,结构定义为:
   typedef struct tagSCROLLINFO
   {
   UINT cbSize ; // set to sizeof (SCROLLINFO)
   UINT fMask ; // values to set or get
   int nMin ; // minimum range value
   int nMax ; // maximum range value
   UINT nPage ; // page size
   int nPos ; // current position
   int nTrackPos ; // current tracking position
   }SCROLLINFO
  函数SetScrollInfo和GetScrollInfo的参数LPSCROLLINFO lpsi指向该结构。
  在程序中,可以定义如下的SCROLLINFO结构型态:
  SCROLLINFO si ;
  在调用SetScrollInfo或GetScrollInfo之前,必须将cbSize字段设定为结构的大小:
  si.cbSize = sizeof (si) ;
  或
  si.cbSize = sizeof (SCROLLINFO) ;
  逐渐熟悉Windows后,您就会发现另外几个结构像这个结构一样,第一个字段指出了结构大小。这个字段使将来的Windows版本可以扩充结构并添加新的功能,并且仍然与以前编译的版本兼容。
  把fMask字段设定为一个以上以SIF前缀开头的旗标,并且可以使用C的位操作OR运算子(|)组合这些旗标。
  SetScrollInfo函数使用SIF_RANGE旗标时,必须把nMin和nMax字段设定为所需的卷动列范围。GetScrollInfo函数使用SIF_RANGE旗标时,应把nMin和nMax字段设定为从函数传回的目前范围。
  SIF_POS旗标也一样。当通过SetScrollInfo使用它时,必须把结构的nPos字段设定为所需的位置。可以通过GetScrollInfo使用SIF_POS旗标来取得目前位置。
  使用SIF_PAGE旗标能够取得页面大小。用SetScrollInfo函数把nPage设定为所需的页面大小。GetScrollInfo使用SIF_PAGE旗标可以取得目前页面的大小。如果不想得到比例化的卷动列,就不要使用该旗标。
  当处理带有SB_THUMBTRACK或SB_THUMBPOSITION通知码的WM_VSCROLL或WM_HSCROLL消息时,通过GetScrollInfo只使用SIF_TRACKPOS旗标。从函数的传回中,SCROLLINFO结构的nTrackPos字段将指出目前的32位的卷动方块位置。
 
 
//头文件中添加如下内容,m_page记得初始化
int m_page;

int GetScrollPos(int nBar, UINT nSBCode);
void ScrollClient(int nBar, int nPos) ;
void VScrool(int nBar, UINT nSBCode) ;
 
//在OnInitDialog里添加如下代码为对话框创建一个垂直滚动条
	CRect rc;  
    GetClientRect(&rc);  
  
    const SIZE sz = { rc.right - rc.left, rc.bottom - rc.top };  

    SCROLLINFO si;  
    si.cbSize = sizeof(SCROLLINFO);  
    si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;  
    si.nPos = si.nMin = 1;  
  
    si.nMax = sz.cy*m_page;  
    si.nPage = sz.cy;  
    SetScrollInfo(SB_VERT, &si, FALSE);  //此函数将产生一个垂直滚动条
//为对话框添加下列函数
void ChyperlinkDlg::ScrollClient(int nBar, int nPos)  
{  
    static int s_prevx = 1;  
    static int s_prevy = 1;  
  
    int cx = 0;  
    int cy = 0;  
  
    int& delta = cy;  
    int& prev = s_prevy;
  
    delta = prev - nPos;  
    prev = nPos;  
  
    if(cx || cy)  
    {  
        ScrollWindow(cx, cy, NULL, NULL);  
    }  
}  
int ChyperlinkDlg::GetScrollPos(int nBar, UINT nSBCode)  
{  
    SCROLLINFO si;  
    si.cbSize = sizeof(SCROLLINFO);  
    si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;  
    GetScrollInfo(nBar, &si);  
  
    const int minPos = si.nMin;  
    const int maxPos = si.nMax - (si.nPage - 1);  
  
    int result = -1;  
  
    switch(nSBCode)  
    {  
    case SB_LINEUP /*SB_LINELEFT*/:  
        result = max(si.nPos - 1, minPos);  
        break;  
    case SB_LINEDOWN /*SB_LINERIGHT*/:  
        result = min(si.nPos + 1, maxPos);  
        break;  
    case SB_PAGEUP /*SB_PAGELEFT*/:  
        result = max(si.nPos - (int)si.nPage, minPos);  
        break;  
    case SB_PAGEDOWN /*SB_PAGERIGHT*/:  
        result = min(si.nPos + (int)si.nPage, maxPos);  
        break;  
    case SB_THUMBPOSITION:  
        // do nothing   
        break;  
    case SB_THUMBTRACK:  
        result = si.nTrackPos;  
        break;  
    case SB_TOP /*SB_LEFT*/:  
        result = minPos;  
        break;  
    case SB_BOTTOM /*SB_RIGHT*/:  
        result = maxPos;  
        break;  
    case SB_ENDSCROLL:  
        // do nothing   
        break;  
    }  
  
    return result;  
}  

void ChyperlinkDlg::VScrool(int nBar, UINT nSBCode)  
{  
    const int scrollPos = GetScrollPos(nBar,nSBCode);  
  
    if(scrollPos == -1)  
        return;  
  
    SetScrollPos(nBar, scrollPos, TRUE);  
    ScrollClient(nBar, scrollPos);  
}  

//最后为对话框添加WM_VSCROLL消息响应函数

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

	VScrool(SB_VERT,nSBCode);

	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

好啦,大功告成~


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值