我现在做了一个CListCtrl控件,里面有一个水平滚动条和一个垂直滚动条,这两个滚动条的功能都是完好的,现在有个问题:
当水平滚动条滚到到中间时,一旦拖动垂直滚动条水平滚动条就跑到了最右端,请问这个问题如何解决啊?

解决方案 »

  1.   

    这两个滚动条是MFC自动调用的,我没有做处理
    void CSkinScrollWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    CWnd *pWnd=m_wndLimit.GetWindow(GW_CHILD);
    m_bOp=TRUE;
    pWnd->SendMessage(WM_VSCROLL,MAKELONG(nSBCode,nPos),0);
    //pWnd->SendMessage(WM_HSCROLL,MAKELONG(nSBCode,nPos),0);
    m_bOp=FALSE;
    if(nSBCode==SB_THUMBTRACK) return;
    SCROLLINFO si={0};
    si.cbSize=sizeof(si);
    si.fMask=SIF_ALL;
    pWnd->GetScrollInfo(SB_VERT,&si);
    pScrollBar->SetScrollInfo(&si,TRUE);
    //OnHScroll();
    }void CSkinScrollWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    CWnd *pWnd=m_wndLimit.GetWindow(GW_CHILD);
    m_bOp=TRUE;
    //pWnd->SendMessage(WM_VSCROLL,MAKELONG(nSBCode,nPos),0);
    pWnd->SendMessage(WM_HSCROLL,MAKELONG(nSBCode,nPos),0);
    m_bOp=FALSE;
    if(nSBCode==SB_THUMBTRACK) return;
    SCROLLINFO si={0};
    si.cbSize=sizeof(si);
    si.fMask=SIF_ALL;
    pWnd->GetScrollInfo(SB_HORZ,&si);
    pScrollBar->SetScrollInfo(&si,TRUE);
    }
      

  2.   

    就是一个类似于EXCEL的东西,要看第n行第M列的东西
      

  3.   

    CSkinScrollWnd的基类是什么?
    m_wndLimit是什么类型?
      

  4.   

    CSkinScrollWnd的基类是什么?CWnd
    m_wndLimit是什么类型?CWnd
      

  5.   

    if(nSBCode==SB_THUMBTRACK) return; 
    在这个地方判断这个是为啥?
      

  6.   

    CListCtrl不是可以设成自带的滚动条吗
      

  7.   

    if(nSBCode==SB_THUMBTRACK)
    pWnd->SendMessage(WM_HSCROLL,MAKELONG(nSBCode,nPos),nPos); 
    试一下
      

  8.   

    LRESULT CListCtrlEx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if(message==WM_VSCROLL||message==WM_HSCROLL)
    {
    WORD sbCode=LOWORD(wParam);
    if(sbCode==SB_THUMBTRACK
    ||sbCode==SB_THUMBPOSITION)
    {
    SCROLLINFO siv={0};
    siv.cbSize=sizeof(SCROLLINFO);
    siv.fMask=SIF_ALL;
    SCROLLINFO sih=siv;
    int nPos=HIWORD(wParam);
    CRect rcClient;
    GetClientRect(&rcClient);
    GetScrollInfo(SB_VERT,&siv);
    GetScrollInfo(SB_HORZ,&sih);
    SIZE sizeAll;
    if(sih.nPage==0) 
    sizeAll.cx=rcClient.right;
    else
    sizeAll.cx=rcClient.right*(sih.nMax+1)/sih.nPage ;
    if(siv.nPage==0)
    sizeAll.cy=rcClient.bottom;
    else
    sizeAll.cy=rcClient.bottom*(siv.nMax+1)/siv.nPage ;

    SIZE size={0,0};
    if(WM_VSCROLL==message)
    {
    //size.cx=sizeAll.cx*sih.nPos/(sih.nMax+1);
    size.cy=sizeAll.cy*(nPos-siv.nPos)/(siv.nMax+1);
    }else
    {
    size.cx=sizeAll.cx*(nPos-sih.nPos)/(sih.nMax+1);
    //size.cy=sizeAll.cy*siv.nPos/(siv.nMax+1);
    }
    Scroll(size);
    return 1;
    }
    }
    return CListCtrl::WindowProc(message, wParam, lParam);
    }
    注释里面这2句