2010-09-20 4 views
0

Je travaille sur une application MFC basée sur des dialogues dans WinCE. J'ai créé quelques contrôles dans une boîte de dialogue et défiler vers le bas. Lorsque je remonte à nouveau, les commandes du premier écran ont disparu.Les contrôles MFC disparaissent après le défilement

Controls se créé dans OnInitDialog() comme ci-dessous aux coordonnées (50,10)

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

manipulation de rouleau que je fais dans OnVScroll() comme ci-dessous

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

Je traitais Faites défiler la liste et faites défiler vers le haut. Pendant le défilement, toutes les commandes de la boîte de dialogue sont affichées. Mais en faisant défiler vers le haut, les commandes en haut ont disparu.

Que se passe-t-il? Devrais-je implémenter la méthode OnPaint() pour dessiner les contrôles chaque fois que je défile? Si oui, comment?

+0

déplacez-vous/redimensionnez-vous ces contrôles? Peut-être que vous calculez des limites incorrectement quelque part? Fonctionnent-ils encore ou sont-ils complètement partis? Est-ce qu'ils disparaissent partiellement si vous faites défiler vers le bas un peu, ou est-ce toujours le contrôle entier? – tenfour

+0

Il n'y a pas de bouton de réduction dans l'émulateur My WinCE. Suis Windows Mobile 6.x SDK avec Visual Studio 2008 – bjskishore123

+0

@tenfour: Toujours le contrôle entier est en train de disparaître. – bjskishore123

Répondre

1

J'ai le code suivant qui fonctionne bien. J'espère que ça t'aidera.

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

Merci beaucoup. +1 et acceptation de la réponse – bjskishore123

+0

@ bjskishore123 Je suis content que cela ait aidé :) – Tassos

+0

Ce n'est pas une solution. Cela exposera le même problème que vous avez résolu: les fenêtres enfants disparaîtront. Cela est expliqué dans la documentation de [CWnd :: ScrollWindowEx] (https://msdn.microsoft.com/en-us/library/dwbfte93.aspx): * "Si l'indicateur SW_SCROLLCHILDREN est spécifié, Windows ne sera pas mis à jour correctement l'écran si une partie d'une fenêtre enfant est défilée. "* La solution consiste à déplacer manuellement les fenêtres enfants appelant [DeferWindowPos] (https://msdn.microsoft.com/library/windows/desktop/ms632681). – IInspectable

1

De l'ScrollWindowEx documents:

dy
Spécifie la quantité, en unités de dispositif, de défilement vertical. Ce paramètre doit être et négatif valeur pour faire défiler vers le haut.

J'ai mis en gras la phrase pertinente.

+0

Oui, j'utilise une valeur négative uniquement pour faire défiler vers le bas. Désolé, je n'ai pas montré les valeurs de macro dans le code. – bjskishore123

Questions connexes