Problème barre de défilement - API WIN32 [Résolu]

lectpe 163 Messages postés lundi 12 novembre 2007Date d'inscription 17 juillet 2010 Dernière intervention - 23 avril 2009 à 19:30 - Dernière réponse : uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

3 réponses

lectpe 163 Messages postés lundi 12 novembre 2007Date d'inscription 17 juillet 2010 Dernière intervention - 24 avril 2009 à 14:13
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de lectpe
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 24 avril 2009 à 00:44
0
Utile
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.
Commenter la réponse de uaip
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 24 avril 2009 à 15:52
0
Utile
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.
Commenter la réponse de uaip

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.