2008-10-28 5 views
1

Je crée une classe dérivée de CScrollBar dans une application MFC basée sur un dialogue. Dans la classe de dialogue (MyScrollbarDlg), je définis le message ON_WM_VSCROLL et déclare la méthode OnVSCroll dans le fichier d'en-tête. J'implémente également la méthode OnVScroll() dans le fichier .cpp correspondant. Mais à ma grande surprise, lorsque j'ai cliqué sur la flèche au bas de la barre de défilement, elle n'a fait son travail que pour la première fois. Je veux déboguer mon code, donc j'ai mis un point d'arrêt dans la méthode OnVScroll. Puis une chose étrange est arrivée. Le point de rupture est seulement arrivé au premier clic. Quand je continue, la barre de défilement a disparu de la boîte de dialogue! Je n'ai aucune idée de comment cela pourrait arriver. Quelqu'un pourrait-il m'aider à réparer ce bug ennuyeux? Merci beaucoup!Pourquoi la méthode OnVScroll() n'entre qu'une seule fois?

J'ai mis la plage de défilement comme ci-dessous:

SCROLLINFO scrllInfo; 
    m_scrollbar.GetScrollInfo(&scrllInfo, SIF_ALL); 
    scrllInfo.nMax = 15; 
    scrllInfo.nMin = 0; 
    scrllInfo.nPage = 0; 
    scrllInfo.nPos = 0; 
    m_scrollbar.SetScrollInfo(&scrllInfo, TRUE); 

BTW, je n'utilise pas la barre de défilement intégrée de la boîte de dialogue, mais un contrôle scrollbar qui a fixé à être membre de la boîte de dialogue.

J'ai fait quelques expériences et j'ai constaté que le problème que j'ai mentionné ne s'est produit que lorsque j'ai cliqué sur la flèche en bas du contrôle de la barre de défilement. Il agit bien lorsque je clique sur l'autre flèche ou que je fais glisser la boîte de défilement. Y at-il quelque chose de différent lorsque vous cliquez sur la flèche du bas d'une barre de défilement dont je ne suis pas au courant?

J'ai compris que lorsque le message de défilement est NOT THUMBPOSITION ou THUMBTRACK, le paramètre nPos de la méthode OnVScroll() n'est pas utilisé. Donc, j'ai changé mon code comme ceci:

int currPos = m_scrollbar.GetScrollPos(); m_scrollbar.SetScrollPos(currPos + 1, TRUE); 

Cette fois-ci, il agit normal, mais si je mets un point de rupture, la barre de défilement a disparu à nouveau. Est-ce que tu sais pourquoi?

+0

s'il vous plaît arrêter de donner des commentaires à votre propre question sous forme de réponses. Ce n'est pas un forum. Il suffit de modifier votre question originale, ou commenter d'autres réponses. – TheSoftwareJedi

Répondre

1

Assurez-vous que vous avez défini la plage de défilement. Si vous ne le définissez pas, votre méthode ne sera appelée qu'une seule fois.

Been there ...


{modifier} J'ai eu plus de chance avec

m_ScrollBar.SetScrollRange(min, max); 

que la mise en SCROLLINFO.

Vous pouvez vérifier le champ des indicateurs pour voir s'il est correctement défini avant d'enregistrer.

En outre, vérifiez que vous appelez

m_ScrollBar.SetScrollPos(CurPos); 

pour définir la position une fois que vous cliquez sur le bouton

Questions connexes