setscrollpos的参数改为nTemp1试试

解决方案 »

  1.   

    原因应该是这样,我在Dialog里初始化滚动条位置为30:
    CEx06aDialog dlg;
    dlg.m_nLoyal  = 30;
    然后当每次UpdateData(FALSE)时就把30又传给m_nLoyal,所以每次滑块都回到30的位置。
    但有个问题,本来滑块一开始就应该在30的位置的,但开始时滑块却是在0的位置,我在滑块上单击,编辑框中还是0,说明这时nPos=0,但滑块却跑到30的位置,说明这时滑块位置是由m_nLoyal=30决定的而不是由pScrollBar->SetScrollPos(nPos)决定的,这是怎么回事?参数nPos和m_nLoyal到底分别是在什么时候起作用?
      

  2.   

    还有,updatedata是对所有控件起作用,如果我想针对指定控件该怎么办?上面如果可以把npos直接传给编辑框的话这个问题就不会出现了,该怎么把信息传给指定控件?
      

  3.   

    可以用CWnd::GetDlgItem得到控件句柄,然后怎么办?怎么在该控件(比如编辑框)上显示数据?
      

  4.   

    你直接賦值給CEdit.用SetDlgItemText.
      

  5.   

    删掉在DDX里有m_nLay的那一行。
    调用DoModal() 之前。dlg.GetDlgItem( IDC_SCROLL1 )->SetPos( 30 );
      

  6.   

    谢谢楼上的,可以了,这个办法不错,虽然不是好的解决办法
    刚学vc,对DDX和DDV不是很清楚,删掉在DDX里有m_nLay的那一行是不是禁止程序跟滚动条之间的信息交换?
      

  7.   

    “然后当每次UpdateData(FALSE)时就把30又传给m_nLoyal,所以每次滑块都回到30的位置。
    但有个问题,本来滑块一开始就应该在30的位置的,但开始时滑块却是在0的位置,我在滑块上单击,编辑框中还是0,说明这时nPos=0,但滑块却跑到30的位置,说明这时滑块位置是由m_nLoyal=30决定的而不是由pScrollBar->SetScrollPos(nPos)决定的,这是怎么回事?参数nPos和m_nLoyal到底分别是在什么时候起作用?”我猜想是setScrollPos()成功,但是马上又被updatedata()给设置回去了在函数开始的地方用updatedata(true)试一试?
      

  8.   

    ((CScrollBar*)GetDlgItem(IDC_XXXXXXX))->SetScrollPos(nPos)
      

  9.   

    原因应该是这样,我在Dialog里初始化滚动条位置为30:
    /*CEx06aDialog dlg;
    dlg.m_nLoyal  = 30;
    然后当每次UpdateData(FALSE)时就把30又传给m_nLoyal,所以每次滑块都回到30的位置。
    但有个问题,本来滑块一开始就应该在30的位置的,但开始时滑块却是在0的位置,我在滑块上单击,编辑框中还是0,说明这时nPos=0,但滑块却跑到30的位置,说明这时滑块位置是由m_nLoyal=30决定的而不是由pScrollBar->SetScrollPos(nPos)决定的,这是怎么回事?参数nPos和m_nLoyal到底分别是在什么时候起作用?*/nPos在你pScrollBar->SetScrollPos(nPos);时决定滚动条的位置,而m_nLoyal在你UpdateData(FALSE);时决定了滚动条的位置,你的m_nLoyal从来就没有变过,始终是30,所以即使你用pScrollBar->SetScrollPos(nPos);设置了正确的位置,到了UpdateData(FALSE);的时候滚动条又被设回了最初的位置30。
    你可以试一试这样改:void CEx06aDialog::OnHScroll(
                       UINT nSBCode,
                       UINT nPos,
                       CScrollBar* pScrollBar) 
    {         nTemp1=pScrollBar->GetScrollPos();
             switch(nSBCode)
             {
             case SB_THUMBPOSITION:
                      m_nLoyal = nPos;
                      m_nSpos = nPos;
                      UpdateData(FALSE);
                      break;
             //other code
             }
    }
      

  10.   

    谢谢楼上的
    还有个问题,为什么pScrollBar->SetScrollPos(30);可以,但CEx06aDialog dlg;
    ((CScrollBar *)dlg.GetDlgItem(IDC_LOYAL))->SetScrollPos(30);编译过不去,改成((CScrollBar *)dlg.GetDlgItem(IDC_LOYAL))->SetScrollPos(SB_HORZ,30);通过编译,但运行出错?
      

  11.   

    你用GetDlgItem(IDC_LOYAL)得到的是指向CSliderCtrl的指针,并非指向一个CScrollBar,所以你试试这样调用:((CSliderCtrl*)GetDlgItem(IDC_LOYAL))->SetPos(30);
      

  12.   

    我来做结吧!
    先UpdateData(TRUE);
    再UpdateData(FALSE);
      

  13.   

    soloist(独行独奏):还是不行,运行出错算了,以后再说吧,结帐了