Positionnement et Scroll

Signaler
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015
-
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015
-
Bonjour

J'ai une fenetre avec plusieurs widgets
On ne voit qu'une partie de cette fenetre, le reste étant visible en déplaçant les scrolls.
Jusque là, ca fonctionne.

La fonctionnalité que je voudrais ajouter est celle-ci :
je peux passer d'un widget à un autre via la touche TAB
je voudrais que lorsque le widget qui a le focus est en dehors de la fenetre visible,
un scroll est fait de manière à ce que le widget soit visible
(donc le meme fonctionnement qui existe sur les navigateurs internet)

voici mon code
void Positionne_scroll (HWND hwnd)
{
RECT RecthWndParent;
HWND hWndDlgParent;
int x, y;
RECT RectImageDepart;
POINT lpPoint;
int min_x;
int min_y;
int max_x;
int max_y;


// Récupère fenêtre mère 
hWndDlgParent = GetParent(hwnd);
GetWindowRect (hWndDlgParent, &RecthWndParent);


// Récupère position horiz et vert des scrolls 
y = GetScrollPos(hWndDlgParent, SB_VERT);
x = GetScrollPos(hWndDlgParent, SB_HORZ);


// Récupère dimensions widget
GetWindowRect (hwnd, &RectImageDepart);

// Calcule sa position dans la fenêtre mère
lpPoint.x = RectImageDepart.left;
lpPoint.y = RectImageDepart.top;
ScreenToClient(hWndDlgParent, &lpPoint);


// Calcule position de la fenêtre visible par rapport à la fenêtre mère
min_x = x;
min_y = y;
max_x = x + RecthWndParent.right - RecthWndParent.left;
max_y = y + RecthWndParent.bottom - RecthWndParent.top;


// Vérifie si le widget qui a le focus est dans la fenêtre visible 
// s'il est en dehors, on positionne les scroll et on scrolle
if (
  	  (lpPoint.x >= min_x) &&
  	  (lpPoint.x <= max_x) &&
  	  (lpPoint.y >= min_y) &&
  	  (lpPoint.y <= max_y) 
)
{	
// on fait rien
// le widget est dans la fenètre visible 
}
else 
{
// On positionne les scrolls
SetScrollPos(hWndDlgParent, SB_VERT, lpPoint.y, TRUE);
SetScrollPos(hWndDlgParent, SB_HORZ, lpPoint.x, TRUE);

// On scrolle la fenêtre
ScrollWindow(hWndDlgParent, (x - GetScrollPos(hWndDlgParent, SB_HORZ)), (y - GetScrollPos(hWndDlgParent, SB_VERT)), NULL, NULL);
}
}


l'algo doit être bon, mais ca ne fonctionne pas toujours :(
dans certains cas, c'est bon, dans d'autres non,


merci de dire où peut se trouver mon erreur

1 réponse

Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

J'ai trouvé
Bon en fait, c'était "simple", il fallait seulement modifier 2 lignes :
// Calcule sa position dans la fenêtre mère
lpPoint.x = RectImageDepart.left + x;
lpPoint.y = RectImageDepart.top + y;
ScreenToClient(hWndDlgParent, &lpPoint);


Le code n'est pas parfait, car il faut ajouter quelques ajustements
mais ça, c'est du confort