我在对话框中加如了滚动条后,比如在OnPaint()中,
dc.MoveTo(100,100);
dc.LineTo(1000,1000);
首先是只画出了一部分,但是按了滚动条后,画的乱七八糟的,是不是在OnVScroll()中还要加什么处理代码?

解决方案 »

  1.   

    滚动之后,要调用UpdateWindow才行.
      

  2.   

    用UpdateWIndow() 不行,应该用在什么位置?用Invalidate()每一次都重新重头画,和没有滚动条效果一样,不行
      

  3.   

    呵呵,毫无疑问,你的滚动消息处理有问题,根本不需要使用Invalidate()与
    UpdateWIndow()的,只需要ScrollWindow(x滚动量,y滚动量)就可以了。你画了一个表格,我估计你只想滚动一部分。应该这样:
    ScrollWindow(0, dY, NULL ,rect);
    第三个参数必须是NULL。
      

  4.   

    这是我的消息处理代码
    void CMyTabDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    int h = 20;
    SCROLLINFO si;
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL;
    GetScrollInfo(SB_VERT,&si);
    int nOldPos = si.nPos;
    switch(nSBCode)
    {
    case SB_LINEDOWN:
    si.nPos = min(si.nPos+h,si.nMax);
    break;
    case SB_PAGEDOWN:
    si.nPos = min(si.nPos+h*10,si.nMax);
    break;
    case SB_LINEUP:
    si.nPos = max(si.nPos-h,si.nMin);
    break;
    case SB_PAGEUP:
    si.nPos = max(si.nPos-h*10,si.nMin);
    break;
    case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
    si.nPos = si.nTrackPos;
    break;
    case SB_TOP:
    si.nPos = si.nMin;
    break;
    case SB_BOTTOM:
    si.nPos = si.nMax;
    break;
    }
    SetScrollInfo(SB_VERT,&si);
    GetScrollInfo(SB_VERT,&si);
    ScrollWindow(0,nOldPos-si.nPos);
    }
      

  5.   

    问题在于他的线实在OnPaint中绘制的,也就是说在每次绘制窗口时都需要重新绘制该线条。因此必须在ScrollWindow后调用UpdateWindow重新绘制该线条。否则肯定是乱了。
    至于UpdateWindow不起作用的问题,我也遇到了。我现在没有办法,用ShowWindow( SW_HIDE );ShowWindow( SW_SHOW )代替了。
      

  6.   

    wei_gogo(最后一支烟) 在ScrollWindow之后,添加代码UpdateWindow(),如果不起作用,就用
    ShowWindow( SW_HIDE );//隐藏窗口
    ShowWindow( SW_SHOW );//显示窗口,这样可以强制窗口重新绘制