请教滚动条的用法,我想知道:在用鼠标拖动滑快的时候,怎么让内容一起滑动。现在是鼠标拖动时,内容不动,当鼠标键松开时,内容才变化。我试了试timerSetTimer(1, 500, NULL);
void CChartScrollView::OnTimer(UINT nIDEvent) 
{
INT nPos = m_nPos;
if (nIDEvent == 1)
{
nPos = GetScrollPos(SB_VERT); if (nPos != m_nPos)
{
ScrollWindow(0, m_nPos - nPos, NULL, NULL);

}

CWnd::OnTimer(nIDEvent);
}但是 ScrollWindow(0, m_nPos - nPos, NULL, NULL);总是不执行谁有好的方法,请指教

解决方案 »

  1.   

    对话框滚动条与显示区的处理,供参考代码很长,你慢慢看吧!
    void CSystemdlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default 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;
    }

    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }void CSystemdlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default 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;
    } CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
      

  2.   

    你检测WM_VSCROLL和WM_HSCROLL,你在这两个消息改变你滚动操作!
      

  3.   

    to lingfeng8888:
       
        怎么能在拖动滑快的同时,让显示区移动。你的OnVScroll和OnHScroll方法写的太罗嗦了,可以简化很多,而且对我没有什么帮助
      

  4.   

    case SB_THUMBTRACK:
    ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
    scrollinfo.nPos = nPos;
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    break;
    case SB_THUMBTRACK:
    ScrollWindow((scrollinfo.nPos-nPos)*10,0);
    scrollinfo.nPos = nPos;
    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
    break;
    以上分别为垂直和水平滚动条中鼠标拖动滑块时的处理子段。
    其实,你查一下MSDN,其中有很详细的说明的。
      

  5.   

    滚动条我没做过,但学习vc的时候做过练习,没有你想得那么简单的
    要想客户区不断更新,需要ondraw
    visual c++6从入门到精通
    这本书上有个滚动条的例子
      

  6.   

    如果你还不明白我也没有办法了
    case SB_THUMBTRACK:
    ScrollWindow(0,(scrollinfo.nPos-nPos)*10);//按步长滚动窗口
    scrollinfo.nPos = nPos;         //将新位置的值传入
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);//scrollinfo并设置
    break;
    case SB_THUMBTRACK:
    ScrollWindow((scrollinfo.nPos-nPos)*10,0);//按步长滚动窗口
    scrollinfo.nPos = nPos;         //将新位置的值传入
    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);//scrollinfo并设置
    break;
      

  7.   

    我这样不对吗? switch (nSBCode)
    {
    case SB_LINEDOWN:
    if (m_nScrollRange - m_nPos < 100)
    m_nPos = m_nScrollRange;
    else
    m_nPos += 100; break; case SB_LINEUP:
    if (m_nPos < 100)
    m_nPos = 0;
    else
    m_nPos -= 100; break; case SB_PAGEDOWN:
    if (m_nScrollRange - m_nPos < rect.Height())
    m_nPos = m_nScrollRange;
    else
    m_nPos += rect.Height(); break; case SB_PAGEUP:
    if (m_nPos < rect.Height())
    m_nPos = 0;
    else
    m_nPos -= rect.Height(); break; case SB_THUMBPOSITION:
    m_nPos = nPos; break; default:
    break;
    } SetScrollPos(SB_VERT, m_nPos); if (nBeforePos != m_nPos)
    {
    ScrollWindow(0, nBeforePos - m_nPos, NULL, NULL);
    }

    CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
    我的窗口是从CWnd继承来的,没有使用CScrollView,所以不会在滑快拖动的时候,左侧显示区也改变,而是拖动完毕,松开鼠标,左侧显示区才刷新,大家明白我的意思了吗?
      

  8.   

    我用Timer的意思说:我想在拖动的时候(不松开鼠标),定时检测当前滑快的位置,将显示区内容调整到相应位置,可是不好用,我的OnVScroll早就写过了
      

  9.   

    我犯了一个错误,我记忆中SB_THUMBTRACK 和 SB_THUMBPOSITION的作用是一样的,所以我就只处理了一个,呵呵。