代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

MFC控件在滚动后消失

  •  0
  • bjskishore123  · 技术社区  · 15 年前

    我正在WinCE中开发基于对话框的MFC应用程序。 我在对话框中创建了几个控件并向下滚动。 当我再次向上滚动时,第一个屏幕中的控件消失了。

    test->Create(_T("Title"), WS_CHILD|WS_VISIBLE, CRect(50,10,200,40), this, ID_TITLE);
    

     switch(nSBCode)
     {
      case SB_LINEDOWN:
      {
       if(nPos < max)
       {
        ScrollWindowEx(0, SCROLLDOWN_LINE_STEPSIZE, CRect(0,0, rect.right - 25, rect.bottom), NULL, NULL, NULL, SW_SCROLLCHILDREN | SW_INVALIDATE); 
        pScrollBar->SetScrollPos(nPos - SCROLLDOWN_LINE_STEPSIZE); //nPos+10
       }
       break;
      }
      case SB_LINEUP:
      {
       if(nPos > min)
       {
        ScrollWindowEx(0, SCROLLUP_LINE_STEPSIZE, CRect(0,0, rect.right - 25, rect.bottom), NULL, NULL, NULL, SW_SCROLLCHILDREN | SW_INVALIDATE); 
        pScrollBar->SetScrollPos(nPos - SCROLLUP_LINE_STEPSIZE); //Ex: nPos-10
       }
       break;
      }
    
     default:
      printf("Notimplemented");
      break;
     }
    

    我正在处理向下滚动和向上滚动。 向下滚动时,将显示对话框中的所有控件。 但在向上滚动时,顶部的控件消失了。

    发生什么事? 我应该实现OnPaint()方法来在每次滚动时绘制控件吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Tassos    15 年前

    我有以下代码可以正常工作。我希望它能帮助你。

    LRESULT CMyWindow::OnVScroll( UINT code, UINT position )
    {
        SCROLLINFO info = { sizeof( SCROLLINFO ), SIF_ALL };
        GetScrollInfo( m_wnd, SB_VERT, &info );
        int previous_pos = info.nPos;
        switch( code )
        {
        case SB_TOP:
            info.nPos = 0;
            break;
        case SB_BOTTOM:
            info.nPos = info.nMax - info.nPage;
            break;
        case SB_LINEDOWN:
            info.nPos = min( info.nPos + 1, info.nMax - (int)info.nPage );
            break;
        case SB_LINEUP:
            info.nPos = max( info.nPos - 1, info.nMin );
            break;
        case SB_PAGEDOWN:
            info.nPos = min( info.nPos + (int)info.nPage, info.nMax - (int)info.nPage );
            break;
        case SB_PAGEUP:
            info.nPos = max( info.nPos - (int)info.nPage, info.nMin );
            break;
        case SB_THUMBTRACK:
        case SB_THUMBPOSITION:
            info.nPos = position;
            break;
        }
        int offset = previous_pos - info.nPos;
        if( offset != 0 )
        {
            ScrollWindowEx( m_wnd, 0, offset, NULL, NULL, NULL, NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
            SetScrollPos( m_wnd, SB_VERT, info.nPos, FALSE );
        }
        return 0L;
    }
    
        2
  •  1
  •   Hans Passant    15 年前


    指定金额,单位为 设备单位,垂直滚动。 此参数必须为 价值 向上滚动。

    我把相关的短语加粗了。

    推荐文章