请教滚动条的用法,我想知道:在用鼠标拖动滑快的时候,怎么让内容一起滑动。现在是鼠标拖动时,内容不动,当鼠标键松开时,内容才变化。我试了试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);总是不执行谁有好的方法,请指教
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);总是不执行谁有好的方法,请指教
解决方案 »
- 过于程序多国语言化,CString的内存的担心。
- 关于error C2383: 'DRAWFUN' : default-arguments are not allowed on this symbol问题
- 如何给CStatic添加垂直滚动条
- 高手帮帮忙 课程设计
- UUID & GUID之间的区别.
- 匹配的算法???
- 难题,高手请入!!!
- 谁有《WINDOWS网络编程技术》书上例子源代码,分全送了。
- 我在console下写好了一个程序,把它加到MFC里时(将.h和.c文件加入到工程目录)下面却出现了unresolved external symbol 的错误
- 我用classwizard添加了一个菜单,然后要处理command消息,我发现.....请进
- 求助:ListCtrl的问题
- 送份,基本的语法问题!!!
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);
}
怎么能在拖动滑快的同时,让显示区移动。你的OnVScroll和OnHScroll方法写的太罗嗦了,可以简化很多,而且对我没有什么帮助
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,其中有很详细的说明的。
要想客户区不断更新,需要ondraw
visual c++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;
{
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,所以不会在滑快拖动的时候,左侧显示区也改变,而是拖动完毕,松开鼠标,左侧显示区才刷新,大家明白我的意思了吗?