Créez votre première tray icon . code très simple et accessible...

Contenu du snippet

Bonjour,
Je sais qu'il existe déjà des sources traîtant ce sujet sur le site, mais comme j'ai malgré tout eu beaucoup de mal à m'en sortir, je me suis dit qu'une source très allégée portant UNIQUEMENT sur l'utilisation des tray icons ne ferait de mal à personne...
Donc je vous livre le .cpp et le .h en esperant que ma première contribution (hé oui) sera utile à quelqu'un...

Nous verrons donc la création et la suppression de l'icône ainsi que la détection d'une action de la souris sur l'icône (clik, double-clik...).
L'idée du programme est en fait de "minimiser" l'IHM dans le systray. j'ai mis des guillemets parce qu'en réalité je n'utilise pas LE bouton minimiser mais un bouton disposé sur l'IHM à cet effet... toujours est-il qu'ensuite il faut double-cliquer sur l'icône pour retrouver l'IHM.

Source / Exemple :


Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <iostream.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Form1->Hide(); //Rigolez-pas, je sais que ça sert à rien mais c'était pour
   Sleep(1000);   //pour voir si la fenêtre partait de la barre des tâches
   Form1->Show(); //quand on la cachait...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   Form1->Hide();

   NI_Data.cbSize = sizeof( NOTIFYICONDATA );
      // Cela permet à Windows de savoir avec quelle version de la structure
      // on souhaite travailler
   NI_Data.hWnd = this->Handle;
      // C'est à ce handle que windows va envoyer les messages provenant de
      // l'icône : permet de gérer les cliks, etc.
   NI_Data.uID = 0;
      // C'est l'identifiant de l'icône dans l'application. Cela permet à
      // Windows de faire la distinction entre différents icônes de notification
      // que l'application a crée.
   NI_Data.hIcon = Application->Icon->Handle;
      // Par défaut notre icone de notification aura le même icone que
      // l'application.
   NI_Data.uCallbackMessage = AM_CALLBACK_MESSAGE;
      //Permet d'intercepter les messages venant du systray (cliks...)
   NI_Data.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
   strcpy(NI_Data.szTip, "Appli de test de trayicon");
      //Permet de définir le texte de l'infobulle...
   Shell_NotifyIcon(NIM_ADD,&NI_Data);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::NotifyCallback(TMessage &message)
{
   if ( message.WParam == 0 )
   // WParam contient l'indice de l'icone de l'appication.
   // En effet une application peut avoir plusieurs icones de notification
   // c'est l'indice que nous avison mis dans uID de la structure de type
   // NOTIFYICONDATA
   {
      if ( message.LParam == WM_LBUTTONDBLCLK ) //WM_RBUTTONUP, WM_LBUTTONDOWN...
      {
         Form1->Show();
         Sleep(100); //pas indispensable mais si vous avez comme moi l'icône de MSN
		     //juste à côté de "la votre" vous comprendrez l'utilité :)
         NI_Data.uFlags = 0;
         Shell_NotifyIcon(NIM_DELETE,&NI_Data);
      }
   }
}
//---------------------------------------------------------------------------

Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

#define AM_CALLBACK_MESSAGE   WM_APP + 408
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// Composants gérés par l'EDI
        TButton *Button1;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
protected:
        void __fastcall NotifyCallback ( TMessage &message );

        BEGIN_MESSAGE_MAP
          VCL_MESSAGE_HANDLER( AM_CALLBACK_MESSAGE, TMessage, NotifyCallback);
        END_MESSAGE_MAP(TForm);

private:
        NOTIFYICONDATA    NI_Data;
public:
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

Conclusion :


Bon, comme je l'avais dit c'est vraiment léger, mais quand on a bien compris ça, on peut très vite et facilement améliorer...
Par exemple on peut ajouter :
//---------------------------------------------------------------------------
if ( message.LParam == WM_RBUTTONUP ) //réagit quand on relâche le clik droit
{
PopupMenu1->Popup( Mouse->CursorPos.x, Mouse->CursorPos.y );
//ouvre un menu popup là où se trouve la souris ;)
}
//---------------------------------------------------------------------------
On peut également utiliser "Shell_NotifyIcon(NIM_MODIFY,&NI_Data);" après modifié des éléments de la structure afin de modifier l'icône ou le texte de l'infobulle etc...

Voilà, je vous souhaite bonne prog et @+

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.