★★★★滚动条的问题,请进,谢谢★★★★ setscrollpos的参数改为nTemp1试试 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 原因应该是这样,我在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到底分别是在什么时候起作用? 还有,updatedata是对所有控件起作用,如果我想针对指定控件该怎么办?上面如果可以把npos直接传给编辑框的话这个问题就不会出现了,该怎么把信息传给指定控件? 可以用CWnd::GetDlgItem得到控件句柄,然后怎么办?怎么在该控件(比如编辑框)上显示数据? 你直接賦值給CEdit.用SetDlgItemText. 删掉在DDX里有m_nLay的那一行。调用DoModal() 之前。dlg.GetDlgItem( IDC_SCROLL1 )->SetPos( 30 ); 谢谢楼上的,可以了,这个办法不错,虽然不是好的解决办法刚学vc,对DDX和DDV不是很清楚,删掉在DDX里有m_nLay的那一行是不是禁止程序跟滚动条之间的信息交换? “然后当每次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)试一试? ((CScrollBar*)GetDlgItem(IDC_XXXXXXX))->SetScrollPos(nPos) 原因应该是这样,我在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 }} 谢谢楼上的还有个问题,为什么pScrollBar->SetScrollPos(30);可以,但CEx06aDialog dlg;((CScrollBar *)dlg.GetDlgItem(IDC_LOYAL))->SetScrollPos(30);编译过不去,改成((CScrollBar *)dlg.GetDlgItem(IDC_LOYAL))->SetScrollPos(SB_HORZ,30);通过编译,但运行出错? 你用GetDlgItem(IDC_LOYAL)得到的是指向CSliderCtrl的指针,并非指向一个CScrollBar,所以你试试这样调用:((CSliderCtrl*)GetDlgItem(IDC_LOYAL))->SetPos(30); 我来做结吧!先UpdateData(TRUE);再UpdateData(FALSE); soloist(独行独奏):还是不行,运行出错算了,以后再说吧,结帐了 inet_addr与Unicode编码问题 wdm驱动程序生产框架一直报错 透明编辑框输入字符重叠 如何检测未释放掉的内存区?(菜鸟发问,给分200) 我怎么加入256或24位色的工具栏。 请教一个简单的问题 父亲与儿子的问题!! 有一条面试的题目,请回答,我给100分 哪里可以找到关于线条类型PS_SOLID,PS_DASH这些的定义?? 我的程序有内存泄漏,为什么DeleteObject不能释放HBITMAP? 如何恢复project? 怎样hook某个程序的键盘按键
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到底分别是在什么时候起作用?
调用DoModal() 之前。dlg.GetDlgItem( IDC_SCROLL1 )->SetPos( 30 );
刚学vc,对DDX和DDV不是很清楚,删掉在DDX里有m_nLay的那一行是不是禁止程序跟滚动条之间的信息交换?
但有个问题,本来滑块一开始就应该在30的位置的,但开始时滑块却是在0的位置,我在滑块上单击,编辑框中还是0,说明这时nPos=0,但滑块却跑到30的位置,说明这时滑块位置是由m_nLoyal=30决定的而不是由pScrollBar->SetScrollPos(nPos)决定的,这是怎么回事?参数nPos和m_nLoyal到底分别是在什么时候起作用?”我猜想是setScrollPos()成功,但是马上又被updatedata()给设置回去了在函数开始的地方用updatedata(true)试一试?
/*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
}
}
还有个问题,为什么pScrollBar->SetScrollPos(30);可以,但CEx06aDialog dlg;
((CScrollBar *)dlg.GetDlgItem(IDC_LOYAL))->SetScrollPos(30);编译过不去,改成((CScrollBar *)dlg.GetDlgItem(IDC_LOYAL))->SetScrollPos(SB_HORZ,30);通过编译,但运行出错?
先UpdateData(TRUE);
再UpdateData(FALSE);