关于CScrollBar类的一些问题 我再对话框中加载滚动条,基本的功能都可以实现,但问题是滚动条存在自动回到起始点的问题。不知道那位大侠可以知道一下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 再试试:在窗体的DeActivated事件加上一句: this.SetScrollState(0,false); 在Activated事件中加上: this.SetScrollState(0,true); 我的没这么复杂int nCurPos=0; switch(nSBCode) { case SB_LINELEFT: if (nCurPos > 0) nCurPos--; break; case SB_LINERIGHT: if (nCurPos < 804) nCurPos++; break; case SB_PAGERIGHT: if (nCurPos < 804) nCurPos++; break; case SB_PAGELEFT: if (nCurPos > 0) nCurPos--; break; case SB_THUMBTRACK: nCurPos = nPos; break; } pScrollBar->SetScrollPos(nCurPos,FALSE); m_x = nCurPos; CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 再试试:在窗体的DeActivated事件加上一句: this.SetScrollState(0,false); 在Activated事件中加上: this.SetScrollState(0,true); 在窗体的DeActivated事件加上一句? 没看明白啊 初始化时m_hscroll.SetScrollRange(0,804,FALSE) 中最后一个参数有什么影响。 // 处理WM_VSCROLL,WM_HSCROLL与此类似void CXXDlg::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.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.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: break; case SB_THUMBPOSITION: 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);} 这个是改变SCROLLINFO的 不能直接用SetScrollPos()? 吗 散分了,问题解决了。问题出现在int nCurPos=0; 在写信息相应的时候,相关相应函数要运行2次,(本人小菜,不知道这个叫什么机制,那位大仙解释一下),这个是调试断点进入的。第一次的时候可以正确设置滚动条当前位置,当第二次运行时,nCurPos将不会被赋值,所以还是初始化的0.解决方法 对nCurPos进行赋值nCurPos = pScrollBar->GetScrollPos();后一切工作就正常了。 求助,关于图像的绘制。 一个很简单但是我还不会的问题,谢谢老大们的指点 关于不规则窗口的问题 在DLL中弹出对话框程序,弹出的不是MessageBox,而是CDialog. 在VC++中,是否可以简单的用SendTo()和Send来区分TCP和UDP呢? 如何利用Windows Html Help Workshop 制作有按钮的chm格式的文件? 一个困扰我很久的问题,希望你进来。 关于windows程序设计的问题,高手请指点 Application中的自定义消息响应问题 Hook问题 对话框的创建过程? 我知道一个输入控件的窗口的句柄,怎么获取它的字体高度?
int nCurPos=0;
switch(nSBCode)
{
case SB_LINELEFT:
if (nCurPos > 0)
nCurPos--;
break;
case SB_LINERIGHT:
if (nCurPos < 804)
nCurPos++;
break;
case SB_PAGERIGHT:
if (nCurPos < 804)
nCurPos++;
break;
case SB_PAGELEFT:
if (nCurPos > 0)
nCurPos--;
break;
case SB_THUMBTRACK:
nCurPos = nPos;
break;
}
pScrollBar->SetScrollPos(nCurPos,FALSE);
m_x = nCurPos;
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
// 处理WM_VSCROLL,WM_HSCROLL与此类似void CXXDlg::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.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.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:
break;
case SB_THUMBPOSITION:
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);
}
int nCurPos=0;
在写信息相应的时候,相关相应函数要运行2次,(本人小菜,不知道这个叫什么机制,那位大仙解释一下),这个是调试断点进入的。
第一次的时候可以正确设置滚动条当前位置,当第二次运行时,nCurPos将不会被赋值,所以还是初始化的0.
解决方法 对nCurPos进行赋值
nCurPos = pScrollBar->GetScrollPos();
后一切工作就正常了。