mogwai93
Messages postés362Date d'inscriptionmardi 31 décembre 2002StatutMembreDernière intervention 4 novembre 2023
-
10 mars 2013 à 18:58
mogwai93
Messages postés362Date d'inscriptionmardi 31 décembre 2002StatutMembreDernière intervention 4 novembre 2023
-
12 mars 2013 à 20:49
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,
mogwai93
Messages postés362Date d'inscriptionmardi 31 décembre 2002StatutMembreDernière intervention 4 novembre 2023 12 mars 2013 à 20:49
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