Problème barre de défilement - API WIN32

Résolu
lectpe Messages postés 162 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 17 juillet 2010 - 23 avril 2009 à 19:30
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 24 avril 2009 à 15:52
Bonjour à tous !!!

Je suis en train de créer une application à l'aide de l'API WIN32 et j'ai un problème lors du défilement de ma scrollbar.

Voici mon code :


...

static HWND hPicturesBoxSB;

SCROLLINFO si;

/* DANS LE WM CREATE */
...
hPicturesBoxSB = CreateWindow("SCROLLBAR", "", WS_CHILD | WS_VISIBLE | SBS_RIGHTALIGN | SBS_VERT, 192, 115, 19, 285, hwnd, NULL, hInst, NULL);

ZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_POS;
si.nMin = 0;
si.nMax = 200;
si.nPos = 0;
SetScrollInfo(hPicturesBoxSB, SB_CTL, &si, FALSE);
...
/* FIN DU WM CREATE */

      case WM_VSCROLL:
         GetScrollInfo((HWND)lParam, SB_VERT, &si);
         switch(LOWORD(wParam))
         {
            case SB_PAGEUP:
               si.nPos - = 2;
               if(si.nPos < si.nMin) si.nPos = si.nMin;
               break;
           
            case SB_PAGEDOWN:
               si.nPos += 2;
               if(si.nPos > si.nMax) si.nPos = si.nMax;
               break;
           
            case SB_LINEUP:
               if(si.nPos > si.nMin) si.nPos--;
               break;
           
            case SB_LINEDOWN:
               if(si.nPos < si.nMax) si.nPos++;
               break;
           
            case SB_THUMBPOSITION:
               si.nPos = HIWORD(wParam);
               break;
         }
         si.fMask = SIF_POS;
         SetScrollInfo((HWND)lParam, SB_CTL, &si, TRUE);
         return TRUE;

Mon problème vient du fait que lorsque je saisis le curseur de la barre de défilement, la curseur se place là où la souris l'a laché (ce qui est normal), mais lorsque je clique sur les flèches ou entre les flèches et le curseur, ce dernier se place tout en bas de la barre de défilement.

J'aimerai savoir pourquoi le curseur de la barre de défilement ne bouge pas simplement d'un ou deux pixels au lieu de se placer tout en bas de la barre de défilement et comment y rémédier.

Merci de votre aide.

Grégory.

3 réponses

lectpe Messages postés 162 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 17 juillet 2010 3
24 avril 2009 à 14:13
Merci beaucoup uaip !!!

En fait, en essayant plusieurs choses, j'ai trouvé par moi même la solution :

J'utilisais la fonction SetScrollInfo et j'ai remplacé cette fonction par SetScrollPos et ça a marché.

En clair, j'ai remplacé GetScrollInfo((HWND)lParam, SB_VERT, &si);
par GetScrollPos(hPicturesBoxSB, SB_CTL);

et SetScrollInfo((HWND)lParam, SB_CTL, &si, TRUE);
par SetScrollPos(hPicturesBoxSB, SB_CTL, CurPos, TRUE);

Voilà.

Grégory.
3
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 avril 2009 à 00:44
Salut,
Je dis sans doute une ânerie, mais je n'ai jamais utilisé SCROLLINFO pour mettre à jour une scrollbar.
Je te montre comment je procède et ça fonctionne très bien : (tu peux remplacer SB_THUMBTRACK pas SB_THUMBPOSITION (ils fonctionnent de la même manière) et recopier SB_PAGEUP pour SB_PAGEDOWN, SB_LINEUP, etc...)



case WM_VSCROLL:
{
    switch (LOWORD(wParam))
    {
        case SB_PAGEUP:
        {
            int pos=SendMessage((HWND)lParam,SBM_GETPOS,0,0)-2;
            SendMessage((HWND)lParam,SBM_SETPOS,pos,FALSE);
            break;
        }
    case SB_THUMBTRACK:
        {
            SendMessage((HWND)lParam,SBM_SETPOS,HIWORD(wParam),FALSE);
            break;
        }
    }
}
En espérant que ça t'aide.

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 avril 2009 à 15:52
On procède donc bien de la même façon (sauf que j'utilise les messages au lieu des macros, celles-ci n'étant pas inclues dans les headers de mon IDE).
C'est aussi à moi de te remercier, car tu m'a fait rappeler que, dans mon projet actuel, j'avais complètement oublié de gérer SB_PAGEUP, SB_LINEUP, etc... ce qui est quand même primordial.
Bref, bonne prog à toi.
(et n'oublie pas de cocher "message accepté" sur ton message, pour que ton topic apparaisse comme "résolu" dans le forum )

Cordialement, uaip.
0
Rejoignez-nous