Recherche sur le blog

mercredi 12 mars 2014

[WD19] Icone dans la zone de notification

Un tout nouveau “tutorial” pour apprendre à minimiser son application sous forme d’icône dans la zone de notification de la barre de tâches. Dans notre cas, nous allons faire en sorte que l’icône en question apparaisse en permanence ; lors d’un double-clic sur celle-ci, la fenêtre principale de l’application sera restaurée et mise en avant plan.

L’avantage est qu’il est ainsi possible de laisser une application active en arrière-plan sans qu’elle ne gêne l’utilisateur ; en effet, lorsque la barre de tâches est remplie, c’est souvent assez sport pour s’y retrouver ! Les applications s’accumulent et on n’y voit plus rien.

Créer un menu contextuel

Depuis l’éditeur de fenêtres, chargez la fenêtre principale puis cliquez sur l’onglet “Fenêtre” et choisissez l’option “Menus contextuels”. Utilisez l’option “Nouveau menu contextuel” et créez une entrée au menu. Nommez celle-ci “Restaurer”. Nous ajouterons le code de l’option plus tard.

Ajout de l’icône par programmation

Pour faire apparaitre l’icône, nous appelons la fonction “SysIconeAjoute” dans les déclarations globales de la fenêtre. En paramètre, nous indiquons l’emplacement de l’image de l’icône, le menu contextuel à associer lorsqu’on effectue un clic droit, le message à afficher en cas de survol, et la procédure qui sera appelée pour chaque évènement qui se produit lors d’une interaction avec l’icône.

SysIconeAjoute

Le menu contextuel créé à l’étape précédent s’appelle donc “MENU_Restaurer” et contient, pour rappel, une option du même nom. En guise de message de survol, nous avons choisi le titre de la fenêtre principale. Enfin, nous avons créé une procédure locale à la fenêtre “lproc_handleSysIco”. Un seul paramètre est nécessaire pour celle-ci : le message (type d’évènement) envoyé par Windows.

HandleSysIco

Dans le code du projet, nous avons ajouté l’instruction “EXTERNE” pour charger le fichier “WinConst.WL” qui contient la définition des constantes. Ainsi, comme le montre le code, le fait d’utiliser le nom de la constante ne pose pas de problème. Ici, nous souhaitons que la fenêtre se remette en avant-plan lorsque l’utilisateur double-clique sur l’icône.

  • La propriété “Visible” permet d’afficher la fenêtre dans la barre de tâches.
  • La fonction “FenEtat” modifie fait en sorte que la fenêtre soit à l’avant-plan.
  • La fonction “Restaure” permet de passer de l’état minimisé à restauré.

D’autres évènements pour gérer les clics de souris peuvent être traités dans cette procédure, comme l’indique la documentation officielle de PC SOFT.

Code de l’option du menu contextuel

Nous éditons maintenant le code de l’option de notre menu contextuel “MENU_Restaurer” afin d’appeler la procédure “lproc_handleSysIco()” en lui faisant croire qu’elle a reçu un évènement de type “double-clic”.

appelProcSysIco

Ainsi, lorsqu’on effectue un clic droit sur l’icône, on voit apparaitre le fameux menu contextuel avec son unique option pour faire réapparaitre la fenêtre à l’écran. N’est-ce pas formidable ?

Cacher la fenêtre quand elle est minimisée

Etant donné qu’il n’est pas possible directement de gérer cet évènement lors d’un redimensionnement de la fenêtre, nous allons “surcharger” ce dernier. Cette astuce a été donnée sur les forums de Windev par un certain monsieur Patrice Barreau (merci à lui !).

Il faut tout d’abord définir un ensemble de constantes dans la déclaration de votre projet. Elles correspondent aux différents types de redimensionnements de votre fenêtre. Voici les valeurs.

SIZE_MAXHIDE = 0x0004 // Sent to all pop-up when some other window maximized.
SIZE_MAXIMIZED = 0x0003 //The window has been maximized.
SIZE_MAXSHOW = 0x0002 // Sent to all pop-up when some other window restored.
SIZE_MINIMIZED = 0x0001 //The window has been minimized.
SIZE_RESTORED = 0x0000 // SIZE_MINIMIZED / SIZE_MAXIMIZED don’t apply.

Ensuite dans votre fenêtre principale, vous devez ajouter du code et faire appel à la fonction “Evènement”, de préférence avant même d’avoir créé l’icône système. Le premier paramètre est le nom de la procédure à appeler, le second l’objet auquel on associe l’évènement et le troisième la constante de l’évènement à gérer.

Event

Le deuxième paramètre vaut ici “*.”, cela signifie que l’évènement est géré dans toutes les fenêtres de l’application. Vous pouvez trouver dans la documentation officielle l’ensemble des valeurs possible pour ce paramètre.

Enfin, la dernière étape consiste à créer la fonction “ON_WM_SIZE”, locale à la fenêtre principale. Elle reçoit les trois paramètres habituels : le numéro de message, les premier (wParam) et second (lParam) paramètres du message. On peut alors traiter les différents cas avec un switch, en utilisant les constantes précédemment définies pour chaque cas.

On_WM_SIZE8

Pour l’évènement “fenêtre minimisée”, nous nous sommes basés sur un paramètre défini par l’utilisateur, stocké dans une variable globale de l’application. Valeur provenant également du registre, histoire de bien personnaliser le tout ! Ainsi on peut contrôler si on veut vraiment masquer l’application de la barre de tâche en cas de réduction.

Vous pouvez effectuez d’autres opérations lors du traitement des évènements, comme afficher la hauteur et la largeur de la fenêtre grâce à l’utilisation des fonctions :

  • PoidsFaible : avec en paramètre, lParam.
  • PoidsFort : avec en paramètre, lParam.

A vous d’exploiter au mieux ces évènements !

Fermeture de la fenêtre principale

N’oubliez pas d’effectuer un appel à SysIconeSupprime afin que l’icône soit proprement enlevée de la zone de notification.

Résultat

La fenêtre… Dans le menu “Fichier”, nous avons ajouter une option à cocher afin de déterminer s’il faut oui ou non masquer l’application de la barre de tâches lorsque celle-ci est réduite. C’est cette option qui manipule la variable globale et qui sauvegarde le choix dans le registre, pour qu’il soit récupéré au prochain lancement de l’application.

L’icône… Celle-ci a été ajoutée à partir du moment où la fenêtre principale a été initialisée. Nous avons placé le fichier d’icône directement dans la bibliothèque de l’exécutable afin de ne pas référencer un chemin particulier. Dans WinDev, il suffit simplement de placer le fichier dans la catégorie “Autres” de l’explorateur de projet.

FenIconeAffichee

Le menu contextuel lors d’un clic droit… On retrouve bel et bien le fameux menu contextuel que l’on a créé dans la fenêtre principale. Le fait de cliquer sur l’option affichée va restaurer et remettre la fenêtre en avant-plan et ce même si elle est déjà présente dans la barre de tâches. Idem lors d’un double-clic sur l’icône !

FenIcoMenu

Sur ce, maintenant que vous avez compris l’astuce, à vous de jouer : rendez vos applications plus ergonomiques et moins envahissantes ! Bon développement à tous.

Aucun commentaire: