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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 064 fois - Téléchargée 33 fois

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

Ajouter un commentaire

Commentaires

Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
2 décembre 2008

Ha oué ben moi je suis bien content de trouver du code Borland, plutôt que de devoir passer un temps fou à décrypter du WC++ surtout que quand je vais chercher des sources sur le net c'est pour comprendre un truc que j'ai pas pigé... alors si en plus il faut deviner ce qui fait partie du code pur et ce qui est spécifique au compilo, bonjour la galère !
Donc tant que je coderais sur Borland, dsl mais je releaserai du Borland, et il y aura toujours des heureux... (y'a qu'à lire les commentaires précédant les tiens...)

PS : Le "W" à la place du V, c'est pas un hasard ;)
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

je ne vois pas l'interet de release du borland car il n'est pas accepter par tout les compilateur, contrairement a VC++ ou encore DevC++
@+
Messages postés
320
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
16 février 2009

Merci ! C'est exactement ce que je cherchais !!
Messages postés
5
Date d'inscription
mercredi 3 mars 2004
Statut
Membre
Dernière intervention
7 juillet 2015

->olbal
bon je te remerci d'abord pour avoir repris ce que j'ai dit

tu trouveras tout http://wxformbuilder.sourceforge.net/index_en.html#downloads

bref un vrais regale avec la lib wxwidgets
de plus c'est ecrit pour ** bcc ** et vc+= ainsi que devc++

je me suis mis a VC2005 express pour son enviroment ainsi que son debugeur puis je recompile le tous avec devc++ pour voir la portabilitée

@plus
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
2 décembre 2008

Oui, bien sur j'ai vérifié le prototype ^^, et j'ai oublié de signaler que j'ai aussi essayé avec le TApplicationEvents et sa fonction OnMessage...
Décidemment j'ai dû faire une bourde quelquepart mais j'ai pas trouvé pour l'instant.
Dans l'immédiat j'ai une lettre de motivation à écrire, ça va me prendre un moment, mais après je me remets sur builder et si je trouve toujours pas je te donnerais le code :)
Afficher les 30 commentaires

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.