我在对话框上设置了一个滚动条控件,对他设置了一个消息处理函数,但没有办法直接用cscrollbar::onhscroll(),怎么写才能实现滚动条的拖动那?
void CTest2Dlg::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
{
m_scroll.OnHScroll( nSBCode,  nPos, pScrollBar );//不能用
}

解决方案 »

  1.   

    void CDdDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default

    CDialog::SetScrollRange(SB_VERT,0,330,true); 
    CDialog::GetScrollRange(SB_VERT,&minpos, &maxpos); 
    //maxpos = CDialog::GetScrollLimit(SB_VERT);
    static int curpos = CDialog::GetScrollPos(SB_VERT);
    //curaddlian=&curpos;
    SCROLLINFO  info;
    switch (nSBCode)
    {
    case SB_TOP:    // Scroll to far left. //curpos = minpos;

    CDialog::ScrollWindowEx(0,nPos-curpos,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    break; case SB_BOTTOM:    // Scroll to far right.
    curpos = maxpos;

    CDialog::ScrollWindowEx(0,nPos-curpos,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    break; case SB_ENDSCROLL:  // End scroll.
    break; case SB_LINEUP:    // Scroll left.
    if (curpos > minpos)
    {
    curpos-=10;

    CDialog::ScrollWindowEx(0,nPos-curpos,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    }
    break; case SB_LINEDOWN:  // Scroll right.
    //if(maxpos==101){AfxMessageBox(_T("i am here"));}
    if (curpos < maxpos)
    {
    curpos+=10;
    //AfxMessageBox(_T("ok here"));

    CDialog::ScrollWindowEx(0,nPos-curpos,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    }
    //AfxMessageBox(_T("linedown"));
    break; case SB_PAGEUP:   // Scroll one page left.
    // Get the page size. 

    //pScrollBar->GetScrollInfo(&info, SIF_ALL);
    CDialog::GetScrollInfo(SB_VERT,&info, SIF_ALL);
      
    if (curpos > minpos)
    {
    //curpos = max(minpos, curpos - (int) info.nPage);
    curpos = max(minpos, curpos - 10);

    CDialog::ScrollWindowEx(0,10,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    }
    break; case SB_PAGEDOWN:    // Scroll one page right.
    //pScrollBar->GetScrollInfo(&info, SIF_ALL);
    CDialog::GetScrollInfo(SB_VERT,&info, SIF_ALL);
        
    if (curpos < maxpos)
    {
    curpos = min(maxpos, curpos + (int) info.nPage);

    curpos = min(maxpos, curpos + 10);
    CDialog::ScrollWindowEx(0,-10,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    }
    break; case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
    postmp1=nPos;
    if(curpos<postmp1)
    { curpos = nPos;      // of the scroll box at the end of the drag 
    // operation.

    CDialog::ScrollWindowEx(0,-10,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    }
    if(curpos>postmp1)
    {  curpos = nPos;      // of the scroll box at the end of the drag 
    // operation.

    CDialog::ScrollWindowEx(0,10,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    }
    break; case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is 
    int postmp2=curpos;
    curpos = nPos;     // position that the scroll box has been dragged 
      // to.

    CDialog::ScrollWindowEx(0,postmp2-curpos,NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN);
    CDialog::UpdateWindow();
    CDialog::SetScrollPos(SB_VERT,curpos,true);
    break;
    }

    UpdateData(FALSE);
    Invalidate();
    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    虽然我还没有彻底明白这些代码的用处,但它真的能用。
    或许有些是多余的,但总比什么都没有强。