Bonjour,
Autre problème de scrollbar qui n'a rien à voir avec l'autre discussion, dans le cas présent ça n'est plus moi qui gère la scrollbar mais directement Windows.
Le contexte est toujours le même:
Une fenêtre principale, une MDICLIENT fille et diverses fenêtres filles de la MDICLIENT, donc pour simplifier filles au niveau 2 de la fenêtre principale.
On va oublier la MDICLIENT car elle n'est pas visible sur l'écran, j'observe donc ce qui se passe avec une fenêtre fille qui est affichée sur mon écran à l'intérieur de ma fenêtre principale:
La fenêtre fille étant entièrement contenue dans la fenêtre principale, aucun ascenseur n'apparaît sur la fenêtre principale c'est logique !
cas 1) Si avec la souris je déplace ma fenêtre fille pour la faire déborder de ma fenêtre principale (à droite, à gauche, en haut ou en bas) Windows place automatiquement un ascenseur au bon endroit sur la fenêtre principale, c'est encore logique.
cas 2) Si au lieu de déplacer ma fenêtre fille avec la souris je la fais déborder de la fenêtre principale par programmation (MoveWindow), Windows place toujours les ascenseurs au bon endroit ce qui est toujours logique!
Et lorsque je replace la fenêtre fille à l'intérieur de la fenêtre principale (avec la souris ou par un MoveWindow) les ascenseurs disparaissent: fonctionnement correct.
Dernier cas, celui qui évidemment ne marche pas:
cas 3) Lorsque l'utilisateur intervient sur la fenêtre fille il peut arriver qu'en cliquant sur un bouton la fenêtre fille ait besoin d'afficher plus d'informations en largeur (par exemple plus de colonnes si la fenêtre fille représente un tableau),
dans ce cas un MoveWindow par programme est effectué mais sans changement des coordonnées x,y qui sont déjà (0,0) avec seulement une augmentation de la largeur de la fenêtre qui amène la fenêtre fille à déborder en largeur sur la droite de la fenêtre mère.
Et bien dans ce cas Windows n'y voit que du feu et oublie de faire apparaître l'ascenseur horizontal sur la fenêtre principale.
Le problème est identique pour un débordement dans le sens de la hauteur.
Si j'interviens ensuite avec la souris sur la fenêtre principale en l'élargissant ou en la rétrécissant d'à peine 1mm, Windows se réveille et s'aperçoit qu'il avait oublié les ascenseurs et il les place ce qui m'a orienté vers une tentative de solution en forçant le REPAINT de la fenêtre.
Paramètre true dans le MoveWindow, UpdateWindow, InvalidateRect de la fenêtre fille, de la fenêtre mère avec paramètre false, puis true, etc..jusqu'au MessageSend direct d'un WM_PAINT, mais rien n'y fait !
Alors je m'en suis quand même sorti d'une manière qui n'est pas très élégante en me basant sur le fait que le cas 2 marchait.
Je procède en 3 étapes:
- 1) avant d'agrandir ou de rapetisser ma fenêtre fille je la déplace par un 1er MoveWindow à l'extérieur de la fenêtre principale
- 2) une fois celle-ci à l'extérieur, je lui donne ses bonnes dimensions par un 2ème MoveWindow
- 3) une fois celle-ci avec les bonnes dimensions je la ramène à la bonne place par un 3ème MoveWindow
car il faut que ceci marche dans les deux sens c'est à dire que les ascenseurs apparaissent quand elle grandit au-delà de la fenêtre principale, mais aussi qu'ils disparaissent quand elle diminue en deça.
Evidemment cette procédure spécifique n'est exécutée qu'après le test qu'il va y avoir un passage en-deça -> au-delà ou l'inverse, dans tous les autres cas un seul MoveWindow est effectué.
Cette solution fonctionne très bien, mais il est évident que si je poste cette discussion c'est que j'espère que quelqu'un pourra me donner une solution plus élégante.
Merci.