Элементы управления MFC исчезают после прокрутки - PullRequest
0 голосов
/ 20 сентября 2010

Я работаю над диалоговым приложением MFC в WinCE.Я создал несколько элементов управления в диалоге и прокрутил вниз.При повторной прокрутке вверх элементы управления на первом экране исчезли.

Элементы управления создаются в OnInitDialog (), как показано ниже в координатах (50,10)

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

Обработка прокруткиделать в OnVScroll (), как показано ниже

 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 ]

1 голос
/ 20 сентября 2010

Из документов ScrollWindowEx:

dyОпределяет количество, в единицах устройства, вертикальной прокрутки.Этот параметр должен быть отрицательное значение для прокрутки вверх.

Я выделил нужную фразу.

1 голос
/ 20 сентября 2010

У меня есть следующий код, который отлично работает.Я надеюсь, что это поможет вам.

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;
}
...