begin process at 2012 05 30 17:10:35
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

Scroll qui ne fonctionne pas entierement


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Scroll qui ne fonctionne pas entierement

jeudi 17 août 2006 à 08:06:05 | Scroll qui ne fonctionne pas entierement

mogwai93

Bonjour

J'ai une fenetre mère (hWndMainFrame), qui contient une fenetre fille (hWndScroll) avec un objet scroll à coté (hscr).
Tout se passe bien, tant que la fenetre mère ne change pas de taille (via WM_SIZE) et que je ne touche pas au scroll

j'ai un cas particulier, qui ne fait pas ce que je voudrais :
1) affichage de la fenetre principale et des fenetres filles
2) reduction de la taille de la fenetre principale
3) je met le curseur du scroll tout en bas
jusqu'ici l'affichage est correct (du moins il semble correct)

4) agrandissement de la fenetre principale par le haut de la fenetre, jusqu'au depassement de la taille de la fenetre fille (ici 600)
et là, la fenetre fille n'est pas entierement affichée
d'ailleurs pendant l'agrandissement, le scroll semble bizarre ...


Merci de me dire, ce que j'ai oublié ou mal codé


ci-dessous la partie du code gérant le scroll:


=======================
void Update_Scroll(HWND m_hWnd, HWND hscr)
{
    // taille zone cliente
    RECT rcClient;
    GetClientRect(m_hWnd, &rcClient);
    int cyClient = rcClient.bottom - rcClient.top;
   
    int Taille_objet_y = 600;

    // si la taille de la fenetre est superieure à celle à scroller
    if(cyClient >= Taille_objet_y)
        cyClient = Taille_objet_y;

   
    //--------------------------------------------------------------------------
    // infos pour les scrollbars                                               
    SCROLLINFO info;
    info.cbSize = sizeof(SCROLLINFO);


    // scrollbar vertical
    info.nMin    = 0;
    info.nMax    = Taille_objet_y - 2;
    info.nPage    = cyClient-1;
    info.fMask    = SIF_RANGE | SIF_PAGE;// | SIF_DISABLENOSCROLL;
    SetScrollInfo(hscr, SB_CTL, &info, TRUE);
}


void On_VScroll (HWND hWndScroll, HWND hscr, WPARAM wParam)
{
    // récupération infos sur le scrollbar
    SCROLLINFO info;
    info.cbSize = sizeof(SCROLLINFO);
    info.fMask = SIF_ALL;
    GetScrollInfo(hscr, SB_CTL, &info);
    int y = info.nPos;


    // en fonction de l'action à effectuer
    int nSBCode = LOWORD(wParam);
    switch(nSBCode)
    {
        case SB_LINEDOWN        : y++;                    break;
        case SB_LINEUP            : y--;                    break;
        case SB_PAGEDOWN        : y += info.nPage;        break;
        case SB_PAGEUP            : y -= info.nPage;        break;
        case SB_THUMBTRACK        : y = info.nTrackPos;    break;
        case SB_THUMBPOSITION    : y = info.nPos;        break;
    }

    // vérif bornes
    if(y > info.nMax)
        y = info.nMax;
    if(y < info.nMin)
        y = info.nMin;

    // affectation nouvelle position, on scrolle la vue
    SetScrollPos(hscr, SB_CTL, y, TRUE);

    ScrollWindow(hWndScroll, 0, (info.nPos - GetScrollPos(hscr, SB_CTL)), NULL, NULL);
}


case WM_CREATE:
                Update_Scroll(hscr, hWndScroll);
                break;

case WM_SIZE:
                GetClientRect(hWndMainFrame, &rctMainWnd);

                // redimensionnement de la fenetre à scroller en fonction de la taille de la fenetre mere
                SetWindowPos(hWndScroll, HWND_TOP, 5,50, rctMainWnd.right-30, rctMainWnd.bottom-60, SWP_NOACTIVATE | SWP_NOOWNERZORDER);
                UpdateWindow(hWndScroll);

                // maj du scroll
                Update_Scroll(hscr, hWndScroll);
                On_VScroll (hWndScroll, hscr, wParam);
                break;

           case WM_VSCROLL:
                On_VScroll (hWndScroll, hscr, wParam);
                break;
===================================

jeudi 17 août 2006 à 19:00:31 | Re : Scroll qui ne fonctionne pas entierement

aardman

Membre Club
Salut,
J'ai pas de réponse précise a ton problème, mais quelques commentaires:
Je pense que tu ne devrais pas utiliser ScrollWindow() systematiquement. Dans certains cas il est utile (SB_LINEDOWN, SB_LINEUP..) mais pas dans d'autres. De plus si tu te plante dans le calcul de la valeur à scroller, ca affichera vraiment n'importe quoi. Tant que tu debug ton code, je pense qu'il vaut mieux que tu utilises InvalidateRect() pour redessiner toute la fenetre, et ainsi voir si tout est positionné correctement. Ensuite quand ca fonctionnera, tu pourra remettre ScrollWindow().
Le calcul de la position maximum ne me semble pas bon. Il faut prendre en compte la valeur de nPage lors de ce calcul. C'est plutot:
nPos = nMax - (nPage - 1)
vendredi 18 août 2006 à 06:55:48 | Re : Scroll qui ne fonctionne pas entierement

mogwai93

c'est bien la fonction ScrollWindow qui me pose problème, car en la commentant et en mettant InvalidateRect, le scrollbar se comporte correctement et l'affichage aussi...

"Le calcul de la position maximum ne me semble pas bon. Il faut prendre en compte la valeur de nPage lors de ce calcul. C'est plutot:
nPos = nMax - (nPage - 1)"
--> nPos, c'est la position du curseur du scroll, pas la position maximum ?!


vendredi 18 août 2006 à 21:47:06 | Re : Scroll qui ne fonctionne pas entierement

aardman

Membre Club
Salut,
Dans la formule que j'ai donné, nPos c'est la position maximale de ta scrollbar.
Pour le scroll,  tu devrais plutot utiliser ScrollWindowEx(), et commencer par traiter les cas les plus simples (SB_LINEDOWN/SB_LINEUP).

Je ferais un truc de ce genre:
- tu déclare une variable int scrollvalue = 0;
- dans le switch, pour SB_LINEDOWN tu met scrollvalue à 1, pour SB_LINEUP  à -1.
- a la fin, si scrollvalue est != 0,  tu scroll en utilisant scrollvalue, sinon tu invalidate tout.





Cette discussion est classée dans : taille, fenetre, scroll, info, hscr


Répondre à ce message

Sujets en rapport avec ce message

(win32) scroll max [ par mogwai93 ] BonjourJ'ai une fenetre avec comme proprietes WS_VSCROLL et WS_HSCROLLj'aimerais savoir quand les scrolls se trouvent aux extremites, sachant que la f listbox et OnInitDialog [ par raspa ] Bien le bonjour, j'ai un programme en visual c++ 6 avec mfc. Via une fenetre, elle m'ouvre une autre fenetre et dans cette dernier se trove une listeb tabulation et scroll [ par mogwai93 ] Bonjour J'ai une fenetre redimensionnable avec scroll vertical. je voudrais que le scroll se positionne automatiquement sur le widget qui a le focus (win32) scrollbar [ par mogwai93 ] Bonjour j'ai une fenetre, avec l'interieur de cette fenetre, une autre fenetre fille avec scrollbar tant que la fenetre "mere" est fixe (non redimensi (win32) scroll et wm_size [ par mogwai93 ] BonjourJ'ai une fenetre redimensionnable avec 2 scrolls (1 vertical et 1 horizontal)tant que je ne redimensionne pas la fenetre, les 2 scrolls fonctio Comment fixer la taille d'une fenetre ?? [ par crashdown ] Voila , je cree une fenetre mais je sais pas comment faire pour lui donner une dimension fixe!!!Quel parametres je dois mettre pour obtenir l'effet es taille d'une fenetre en mode console... [ par MayouMX ] Bonjour a tous, je suis en train de programmer un petit jeu en mode console grace au langage C (comme une fenetre DOS).J'aimerai modifier la taille de taille et position fenetre mfc mdi visual c++ [ par sofbboy ] Bonjour à tous, Je suis en train de faire une appli mdi mfc. Je cherche à changer la taille et la position des fentres que je crée. Je crée en fait 2 MFC - donner une taille fixe à ma fenetre principale [ par Worldofdada ] Alors, j'ai fait quelques recherches et j'ai trouvé quelques trucs mais pas tout.J'ai crées une appli en MFC single application.Je voudrais que sa tai taille et position d'une fenetre en c++ [ par newuik ] Bonjour a tous!! Voici mon probleme: je souhaiterais récupérer la taille et la position d'une fenetre en c++ mercie d'avance newuik


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,296 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales