2010-09-20 3 views
0

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

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

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

обработка Scroll я делаю в 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() для рисования элементов управления каждый раз, когда я прокручиваю? Если да, то как?

+0

Вы делаете какие-либо перемещения/изменения размера этих элементов управления? Может быть, вы неправильно вычисляете границы? Они все еще функционируют или полностью ушли? Частично ли они исчезают, если вы немного прокручиваетесь, или это всегда полный контроль? – tenfour

+0

В My WinCE эмулятор отсутствует кнопка свернуть. Я использую Windows Mobile 6.x SDK с визуальной студией 2008 – bjskishore123

+0

@tenfour: всегда весь контроль исчезает. – bjskishore123

ответ

1

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

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; 
} 
+0

Большое вам спасибо. +1 и принятие ответа. – bjskishore123

+0

@ bjskishore123 Я рад, что это помогло :) – Tassos

+0

Это не решение. Он выведет ту же проблему, которую вы решили решить: детские окна исчезнут. Это описано в документации [CWnd :: ScrollWindowEx] (https://msdn.microsoft.com/en-us/library/dwbfte93.aspx): * «Если указан флаг SW_SCROLLCHILDREN, Windows не будет правильно обновлять экран, если прокручивается часть дочернего окна ». * Решение состоит в том, чтобы вручную перемещать дочерние окна, вызывающие [DeferWindowPos] (https://msdn.microsoft.com/library/windows/desktop/ms632681). – IInspectable

1

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

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

Я выделил соответствующую фразу.

+0

Да, я использую отрицательное значение только для прокрутки вниз. К сожалению, я не показывал значения макросов в коде. – bjskishore123

Смежные вопросы