Exemples de gestion des ascenseurs

 

Voici des exemples de gestion des ascenseurs:

La gestion des ascenseurs se fera ici dans une fenêtre contenant du texte:

L'idée est simple, une fenêtre affiche du texte, mais celui-ci peut être important et donc ne pas tenir intégralement dans la zone client de la fenêtre. Il faut donc utiliser des ascenseurs.

Image non trouvée !Pour des raisons de simplification du code, j'utilise une police à taille fixe.

 

Faire apparaître les ascenseurs si nécessaire

Premièrement: ne faire apparaître les ascenseurs que si nécessaire:

Je me complique la tâche en disant que l'ascenseur horizontal ne doit apparaître que si une ligne est trop grande et ne peut pas être affichée à l'écran.

Les problèmes qui vont se poser sont alors les suivants:

  • Il faut tout d'abord avoir une fonction qui va vérifier la taille de chacunes des lignes affichées.
    • Si une ligne est trop grande, alors afficher l'ascenseur horizontal.
    • Si aucune lignes trop grande, effacer éventuellement la présence de l'ascenseur.
  • La zone client change de taille lors de l'affichage des ascenseurs. D'où le cas particulier de la seule ligne trop grande qui s'affiche tout en bas de la fenêtre...qui peut être effacée de l'écran par l'affichage d'un ascenseur horizontal. Dans ce cas, la ligne ne sera plus visible, suite à l'affichage de cet ascenseur !
  • Traiter l'affichage des ascenseurs durant un scrolling, mais aussi durant un changement de taille de la fenêtre.

Or modifier les attributs des ascenseurs (SetScrollInfo) provoquent immédiatement un message changement de taille (WM_SIZE). Vous risquez donc de rentrer en boucle infinie, la procédure de gestion des messages n'arrêtant pas de s'appeler pour un changement de taille (Le changement de taille n'ayant pas le temps d'être pris en compte par l'appel précédent !).

D'où la nécessité de vérifier qu'il s'agit bien d'un changement de taille en contrôlant que la fenêtre a bien changé dans le traitement de WM_SIZE.

Bien entendu, le problème de base de l'affichage du texte horizontalement suite au scrolling, on doit afficher le morceau manquant à gauche ou à droite, en vérifiant bien le nombre de caractères affichés !

Image non trouvée !

Remarque ou rappel: Ce code peut être optimisé surtout au niveau de la fonction trtScrollBar, en effet, la fonction SetScrollInfo() est capable d'effacer les ascenseurs si min = max ou si incohérence dans les valeurs.

 

Ascenseurs toujours visibles

Secondo, le cas le plus simple, les ascenseurs sont toujours visibles, on se contente alors de les désactiver ou de les réactiver si nécessaire:

Image non trouvée !Enfin, se contenter c'est vite dit, car modifier les attributs des ascenseurs (toujours cette fonction SetScrollInfo) peut cacher les ascenseurs s'il y a une incohérence entre la taille d'une page et la plage de variation de l'ascenseur. Donc bien calculer !

 

Remarques

Image non trouvée ! Vous aurez certainement remarqué que les évènements SB_TOP et SB_BOTTOM sont codés dans les deux exemples, mais ils ne servent pas actuellement, car ils ne seront jamais émis par Windows. Par contre il pourront vous servir si vous voulez contrôler ces ascenseurs avec le clavier.